benchmark.c 2.7 KB

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