diff --git a/examples/nettle-benchmark.c b/examples/nettle-benchmark.c index 49470045165b693f809726d17855ed18b1f8a756..4a8a5a670d06d12638081551cfa4476dc8fbf267 100644 --- a/examples/nettle-benchmark.c +++ b/examples/nettle-benchmark.c @@ -109,25 +109,57 @@ die(const char *format, ...) static double overhead = 0.0; #if HAVE_CLOCK_GETTIME && defined CLOCK_PROCESS_CPUTIME_ID -#define TIME_TYPE struct timespec -#define TIME_START(start) do { \ - if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &(start)) < 0) \ - die("clock_gettime failed: %s\n", strerror(errno)); \ - } while (0) -#define TIME_END(elapsed, start) do { \ - struct timespec _time_end_after; \ - if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &_time_end_after) < 0) \ - die("clock_gettime failed: %s\n", strerror(errno)); \ - (elapsed) = _time_end_after.tv_sec - (start).tv_sec \ - + 1e-9 * (_time_end_after.tv_nsec - (start).tv_nsec); \ - } while (0) +#define TRY_CLOCK_GETTIME 1 +struct timespec cgt_start; + +static int +cgt_works_p(void) +{ + struct timespec now; + return clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &now) == 0; +} + +static void +cgt_time_start(void) +{ + if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &cgt_start) < 0) + die("clock_gettime failed: %s\n", strerror(errno)); +} + +static double +cgt_time_end(void) +{ + struct timespec end; + if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end) < 0) + die("clock_gettime failed: %s\n", strerror(errno)); + + return end.tv_sec - cgt_start.tv_sec + + 1e-9 * (end.tv_nsec - cgt_start.tv_nsec); +} + +static void (*time_start)(void); +static double (*time_end)(void); + #else /* !HAVE_CLOCK_GETTIME */ -#define TIME_TYPE clock_t -#define TIME_START(start) ((start) = clock) -#define TIME_END(elapsed, start) \ - ((elapsed) = (double) (clock() - (start)) / CLOCKS_PER_SEC) +#define TRY_CLOCK_GETTIME 0 +#define time_start clock_time_start +#define time_end clock_time_end #endif /* !HAVE_CLOCK_GETTIME */ +static clock_t clock_start; + +static void +clock_time_start(void) +{ + clock_start = clock(); +} + +static double +clock_time_end(void) +{ + return (double) (clock() - (clock_start)) / CLOCKS_PER_SEC; +} + /* Returns second per function call */ static double time_function(void (*f)(void *arg), void *arg) @@ -137,12 +169,12 @@ time_function(void (*f)(void *arg), void *arg) for (ncalls = 10 ;;) { - TIME_TYPE start; unsigned i; - TIME_START(start); + + time_start(); for (i = 0; i < ncalls; i++) f(arg); - TIME_END(elapsed, start); + elapsed = time_end(); if (elapsed > BENCH_INTERVAL) break; else if (elapsed < BENCH_INTERVAL / 10) @@ -288,10 +320,7 @@ xalloc(size_t size) { void *p = malloc(size); if (!p) - { - fprintf(stderr, "Virtual memory exhausted.\n"); - abort(); - } + die("Virtual memory exhausted.\n"); return p; } @@ -580,6 +609,20 @@ main(int argc, char **argv) alg = argv[optind]; + /* Choose timing function */ +#if TRY_CLOCK_GETTIME + if (cgt_works_p()) + { + time_start = cgt_time_start; + time_end = cgt_time_end; + } + else + { + fprintf(stderr, "clock_gettime not working, falling back to clock\n"); + time_start = clock_time_start; + time_end = clock_time_end; + } +#endif bench_sha1_compress(); time_overhead();