From a43e80e3b643c5c87ff4e56de4458b2261cbd795 Mon Sep 17 00:00:00 2001 From: Mark Wooding Date: Sat, 10 Nov 2018 13:41:29 +0000 Subject: [PATCH] progs/perftest.c: Introduce top-level option for batching. `-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 | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/progs/perftest.c b/progs/perftest.c index f064c2aa..405bb314 100644 --- a/progs/perftest.c +++ b/progs/perftest.c @@ -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(); -- 2.11.0