aboutsummaryrefslogtreecommitdiff
path: root/contrib/expat/tests/benchmark/benchmark.c
diff options
context:
space:
mode:
authorColeman Kane <cokane@FreeBSD.org>2008-05-08 13:51:16 +0000
committerColeman Kane <cokane@FreeBSD.org>2008-05-08 13:51:16 +0000
commit220ed979dec58fe7c868d7b64de3cd46b27312e9 (patch)
tree140a049e6dfd3941649feaf205e3a527a7543b00 /contrib/expat/tests/benchmark/benchmark.c
parent5bb6a25f8f50862853de4bdb01ecb4152f10d0e7 (diff)
downloadsrc-220ed979dec58fe7c868d7b64de3cd46b27312e9.tar.gz
src-220ed979dec58fe7c868d7b64de3cd46b27312e9.zip
Virgin import (trimmed) of eXpat v2.0.1. Discussed and tested with
sam and phk who are the two consumers of this library. If there is any other fallout, email me and I will take care of it. Approved by: sam, phk
Notes
Notes: svn path=/vendor/expat/dist/; revision=178848
Diffstat (limited to 'contrib/expat/tests/benchmark/benchmark.c')
-rwxr-xr-xcontrib/expat/tests/benchmark/benchmark.c114
1 files changed, 114 insertions, 0 deletions
diff --git a/contrib/expat/tests/benchmark/benchmark.c b/contrib/expat/tests/benchmark/benchmark.c
new file mode 100755
index 000000000000..0f0fd18c1d50
--- /dev/null
+++ b/contrib/expat/tests/benchmark/benchmark.c
@@ -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;
+}