diff --git a/examples/nettle-benchmark.c b/examples/nettle-benchmark.c index 95296ba57ee45bc9ee1bb13657e329f3fb5b063d..9a1529d237ed5fef849fc1b09d26c55d11238a6d 100644 --- a/examples/nettle-benchmark.c +++ b/examples/nettle-benchmark.c @@ -54,12 +54,9 @@ static double frequency = 0.0; -/* Process BENCH_BLOCK bytes at a time, for BENCH_INTERVAL clocks. */ +/* Process BENCH_BLOCK bytes at a time, for BENCH_INTERVAL seconds. */ #define BENCH_BLOCK 10240 -#define BENCH_INTERVAL (CLOCKS_PER_SEC / 4) - -/* Total MB:s, for MB/s figures. */ -#define BENCH_TOTAL 10.0 +#define BENCH_INTERVAL 0.25 /* FIXME: Proper configure test for rdtsc? */ #ifndef WITH_CYCLE_COUNTER @@ -87,13 +84,40 @@ static double frequency = 0.0; static double time_function(void (*f)(void *arg), void *arg) { + unsigned ncalls; +#if HAVE_CLOCK_GETTIME && defined CLOCK_PROCESS_CPUTIME_ID + struct timespec before; + struct timespec after; + struct timespec done; + + clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &before); + done = before; + done.tv_nsec += BENCH_INTERVAL * 1e9; + if (done.tv_nsec >= 1000000000L) + { + done.tv_nsec -= 1000000000L; + done.tv_sec ++; + } + ncalls = 0; + + do + { + f(arg); + clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &after); + ncalls++; + } + while (after.tv_sec < done.tv_sec + || (after.tv_nsec < done.tv_nsec && after.tv_sec == done.tv_sec)); + + return (after.tv_sec - before.tv_sec + + 1e-9 * (after.tv_nsec - before.tv_nsec)) / ncalls; +#else /* !HAVE_CLOCK_GETTIME */ clock_t before; clock_t after; clock_t done; - unsigned ncalls; before = clock(); - done = before + BENCH_INTERVAL; + done = before + BENCH_INTERVAL * CLOCKS_PER_SEC; ncalls = 0; do @@ -105,6 +129,7 @@ time_function(void (*f)(void *arg), void *arg) while (after < done); return ((double)(after - before)) / CLOCKS_PER_SEC / ncalls; +#endif /* !HAVE_CLOCK_GETTIME */ } struct bench_hash_info