]> gerrit.simantics Code Review - simantics/fmil.git/blobdiff - org.simantics.fmil.core/native/FMILibrary/ThirdParty/Expat/expat-2.1.0/tests/benchmark/benchmark.c
Add FMILibrary-2.0.3 to org.simantics.fmil.core\native.
[simantics/fmil.git] / org.simantics.fmil.core / native / FMILibrary / ThirdParty / Expat / expat-2.1.0 / tests / benchmark / benchmark.c
diff --git a/org.simantics.fmil.core/native/FMILibrary/ThirdParty/Expat/expat-2.1.0/tests/benchmark/benchmark.c b/org.simantics.fmil.core/native/FMILibrary/ThirdParty/Expat/expat-2.1.0/tests/benchmark/benchmark.c
new file mode 100644 (file)
index 0000000..0f0fd18
--- /dev/null
@@ -0,0 +1,114 @@
+#include <sys/stat.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+#include "expat.h"
+
+#if defined(__amigaos__) && defined(__USE_INLINE__)
+#include <proto/expat.h>
+#endif
+
+#ifdef XML_LARGE_SIZE
+#define XML_FMT_INT_MOD "ll"
+#else
+#define XML_FMT_INT_MOD "l"
+#endif
+
+static void
+usage(const char *prog, int rc)
+{
+  fprintf(stderr,
+          "usage: %s [-n] filename bufferSize nr_of_loops\n", prog);
+  exit(rc);
+}
+
+int main (int argc, char *argv[]) 
+{
+  XML_Parser  parser;
+  char        *XMLBuf, *XMLBufEnd, *XMLBufPtr;
+  FILE        *fd;
+  struct stat fileAttr;
+  int         nrOfLoops, bufferSize, fileSize, i, isFinal;
+  int         j = 0, ns = 0;
+  clock_t     tstart, tend;
+  double      cpuTime = 0.0;
+
+  if (argc > 1) {
+    if (argv[1][0] == '-') {
+      if (argv[1][1] == 'n' && argv[1][2] == '\0') {
+        ns = 1;
+        j = 1;
+      }
+      else
+        usage(argv[0], 1);
+    }
+  }
+
+  if (argc != j + 4)
+    usage(argv[0], 1);
+
+  if (stat (argv[j + 1], &fileAttr) != 0) {
+    fprintf (stderr, "could not access file '%s'\n", argv[j + 1]);
+    return 2;
+  }
+  
+  fd = fopen (argv[j + 1], "r");
+  if (!fd) {
+    fprintf (stderr, "could not open file '%s'\n", argv[j + 1]);
+    exit(2);
+  }
+  
+  bufferSize = atoi (argv[j + 2]);
+  nrOfLoops = atoi (argv[j + 3]);
+  if (bufferSize <= 0 || nrOfLoops <= 0) {
+    fprintf (stderr, 
+             "buffer size and nr of loops must be greater than zero.\n");
+    exit(3);
+  }
+
+  XMLBuf = malloc (fileAttr.st_size);
+  fileSize = fread (XMLBuf, sizeof (char), fileAttr.st_size, fd);
+  fclose (fd);
+  
+  if (ns)
+    parser = XML_ParserCreateNS(NULL, '!');
+  else
+    parser = XML_ParserCreate(NULL);
+
+  i = 0;
+  XMLBufEnd = XMLBuf + fileSize;
+  while (i < nrOfLoops) {
+    XMLBufPtr = XMLBuf;
+    isFinal = 0;
+    tstart = clock();
+    do {
+      int parseBufferSize = XMLBufEnd - XMLBufPtr;
+      if (parseBufferSize <= bufferSize)
+        isFinal = 1;
+      else
+        parseBufferSize = bufferSize;
+      if (!XML_Parse (parser, XMLBufPtr, parseBufferSize, isFinal)) {
+        fprintf (stderr, "error '%s' at line %" XML_FMT_INT_MOD \
+                     "u character %" XML_FMT_INT_MOD "u\n",
+                 XML_ErrorString (XML_GetErrorCode (parser)),
+                 XML_GetCurrentLineNumber (parser),
+                 XML_GetCurrentColumnNumber (parser));
+        free (XMLBuf);
+        XML_ParserFree (parser);
+        exit (4);
+      }
+      XMLBufPtr += bufferSize;
+    } while (!isFinal);
+    tend = clock();
+    cpuTime += ((double) (tend - tstart)) / CLOCKS_PER_SEC;
+    XML_ParserReset(parser, NULL);
+    i++;
+  }
+
+  XML_ParserFree (parser);
+  free (XMLBuf);
+      
+  printf ("%d loops, with buffer size %d. Average time per loop: %f\n", 
+          nrOfLoops, bufferSize, cpuTime / (double) nrOfLoops);
+  return 0;
+}