Annotation of embedaddon/expat/tests/benchmark/benchmark.c, revision 1.1.1.1

1.1       misho       1: #include <sys/stat.h>
                      2: #include <stdlib.h>
                      3: #include <stdio.h>
                      4: #include <time.h>
                      5: #include "expat.h"
                      6: 
                      7: #if defined(__amigaos__) && defined(__USE_INLINE__)
                      8: #include <proto/expat.h>
                      9: #endif
                     10: 
                     11: #ifdef XML_LARGE_SIZE
                     12: #define XML_FMT_INT_MOD "ll"
                     13: #else
                     14: #define XML_FMT_INT_MOD "l"
                     15: #endif
                     16: 
                     17: static void
                     18: usage(const char *prog, int rc)
                     19: {
                     20:   fprintf(stderr,
                     21:           "usage: %s [-n] filename bufferSize nr_of_loops\n", prog);
                     22:   exit(rc);
                     23: }
                     24: 
                     25: int main (int argc, char *argv[]) 
                     26: {
                     27:   XML_Parser  parser;
                     28:   char        *XMLBuf, *XMLBufEnd, *XMLBufPtr;
                     29:   FILE        *fd;
                     30:   struct stat fileAttr;
                     31:   int         nrOfLoops, bufferSize, fileSize, i, isFinal;
                     32:   int         j = 0, ns = 0;
                     33:   clock_t     tstart, tend;
                     34:   double      cpuTime = 0.0;
                     35: 
                     36:   if (argc > 1) {
                     37:     if (argv[1][0] == '-') {
                     38:       if (argv[1][1] == 'n' && argv[1][2] == '\0') {
                     39:         ns = 1;
                     40:         j = 1;
                     41:       }
                     42:       else
                     43:         usage(argv[0], 1);
                     44:     }
                     45:   }
                     46: 
                     47:   if (argc != j + 4)
                     48:     usage(argv[0], 1);
                     49: 
                     50:   if (stat (argv[j + 1], &fileAttr) != 0) {
                     51:     fprintf (stderr, "could not access file '%s'\n", argv[j + 1]);
                     52:     return 2;
                     53:   }
                     54:   
                     55:   fd = fopen (argv[j + 1], "r");
                     56:   if (!fd) {
                     57:     fprintf (stderr, "could not open file '%s'\n", argv[j + 1]);
                     58:     exit(2);
                     59:   }
                     60:   
                     61:   bufferSize = atoi (argv[j + 2]);
                     62:   nrOfLoops = atoi (argv[j + 3]);
                     63:   if (bufferSize <= 0 || nrOfLoops <= 0) {
                     64:     fprintf (stderr, 
                     65:              "buffer size and nr of loops must be greater than zero.\n");
                     66:     exit(3);
                     67:   }
                     68: 
                     69:   XMLBuf = malloc (fileAttr.st_size);
                     70:   fileSize = fread (XMLBuf, sizeof (char), fileAttr.st_size, fd);
                     71:   fclose (fd);
                     72:   
                     73:   if (ns)
                     74:     parser = XML_ParserCreateNS(NULL, '!');
                     75:   else
                     76:     parser = XML_ParserCreate(NULL);
                     77: 
                     78:   i = 0;
                     79:   XMLBufEnd = XMLBuf + fileSize;
                     80:   while (i < nrOfLoops) {
                     81:     XMLBufPtr = XMLBuf;
                     82:     isFinal = 0;
                     83:     tstart = clock();
                     84:     do {
                     85:       int parseBufferSize = XMLBufEnd - XMLBufPtr;
                     86:       if (parseBufferSize <= bufferSize)
                     87:         isFinal = 1;
                     88:       else
                     89:         parseBufferSize = bufferSize;
                     90:       if (!XML_Parse (parser, XMLBufPtr, parseBufferSize, isFinal)) {
                     91:         fprintf (stderr, "error '%s' at line %" XML_FMT_INT_MOD \
                     92:                      "u character %" XML_FMT_INT_MOD "u\n",
                     93:                  XML_ErrorString (XML_GetErrorCode (parser)),
                     94:                  XML_GetCurrentLineNumber (parser),
                     95:                  XML_GetCurrentColumnNumber (parser));
                     96:         free (XMLBuf);
                     97:         XML_ParserFree (parser);
                     98:         exit (4);
                     99:       }
                    100:       XMLBufPtr += bufferSize;
                    101:     } while (!isFinal);
                    102:     tend = clock();
                    103:     cpuTime += ((double) (tend - tstart)) / CLOCKS_PER_SEC;
                    104:     XML_ParserReset(parser, NULL);
                    105:     i++;
                    106:   }
                    107: 
                    108:   XML_ParserFree (parser);
                    109:   free (XMLBuf);
                    110:       
                    111:   printf ("%d loops, with buffer size %d. Average time per loop: %f\n", 
                    112:           nrOfLoops, bufferSize, cpuTime / (double) nrOfLoops);
                    113:   return 0;
                    114: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>