progs/perftest.c: Introduce top-level option for batching.
authorMark Wooding <mdw@distorted.org.uk>
Sat, 10 Nov 2018 13:41:29 +0000 (13:41 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Sat, 24 Nov 2018 21:53:38 +0000 (21:53 +0000)
`-kN' runs N iterations of the underlying job between looking at the
clock, without affecting the other statistics.  The main purpose here is
to reduce the impact of the measurement overhead.

progs/perftest.c

index f064c2a..405bb31 100644 (file)
@@ -86,6 +86,7 @@ typedef struct opts {
   unsigned gbits;                      /* Group size bits */
   unsigned n;                          /* Number of factors */
   unsigned i;                          /* Number of intervals (or zero) */
+  unsigned k;                          /* Main loop batch size */
   double t;                            /* Time for each interval (secs) */
   mp *e;                               /* Public exponent */
   unsigned f;                          /* Flags */
@@ -678,6 +679,7 @@ Options:\n\
                          data size for enc and hash.\n\
 -n, --factors=COUNT    Number of factors for {exp,mul}-sim.\n\
 -i, --intervals=COUNT  Number of intervals to run for.  [0; forever]\n\
+-k, --batch=COUNT      Number of operations to batch between timer checks.\n\
 -t, --time=TIME                Length of an interval in seconds.  [1]\n\
 ");
 }
@@ -735,7 +737,7 @@ int main(int argc, char *argv[])
   const jobops *j;
   struct timeval tv_next, tv_now;
   double t, ttot;
-  unsigned n;
+  unsigned n, k;
   unsigned long ii;
   clock_t c_start, c_stop;
   double itot;
@@ -754,13 +756,14 @@ int main(int argc, char *argv[])
       { "group-bits",  OPTF_ARGREQ,    0,      'B' },
       { "factors",     OPTF_ARGREQ,    0,      'n' },
       { "intervals",   OPTF_ARGREQ,    0,      'i' },
+      { "batch",       OPTF_ARGREQ,    0,      'k' },
       { "public-exponent", OPTF_ARGREQ, 0,     'e' },
       { "time",                OPTF_ARGREQ,    0,      't' },
       { "no-check",    0,              0,      'q' },
       { 0,             0,              0,      0 }
     };
 
-    i = mdwopt(argc, argv, "hvulC:b:B:n:i:e:t:q", opts, 0, 0, 0);
+    i = mdwopt(argc, argv, "hvulC:b:B:n:i:k:e:t:q", opts, 0, 0, 0);
     if (i < 0) break;
     switch (i) {
       case 'h': help(stdout); exit(0);
@@ -778,6 +781,7 @@ int main(int argc, char *argv[])
        break;
       case 'i': o.i = uarg("interval count", optarg); break;
       case 't': o.t = farg("interval length", optarg); break;
+      case 'k': o.k = uarg("batch size", optarg); break;
       case 'q': o.f |= OF_NOCHECK; break;
       default: usage(stderr); exit(1);
     }
@@ -797,8 +801,8 @@ int main(int argc, char *argv[])
     ii = 0;
     c_start = clock();
     do {
-      j->run(p);
-      ii++;
+      for (k = 0; k < o.k; k++) { j->run(p); }
+      ii += k;
       gettimeofday(&tv_now, 0);
     } while (TV_CMP(&tv_now, <, &tv_next));
     c_stop = clock();