Annotation of embedaddon/expat/tests/benchmark/benchmark.c, revision 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>