bogus timing calculation in gcrypts benchmark
Tobias Ulmer
tobiasu at tmux.org
Sun Mar 7 00:14:49 CET 2010
Hi there,
I've had a look at the catastrophic results of gcrypt on BSD systems
posted here:
http://www.phoronix.com/scan.php?page=article&item=linux_bsd_opensolaris&num=3
It turns out that this is due to a number of bugs in benchmark.c.
It uses CLOCKS_PER_SEC, which on BSD systems is the actual tick rate,
but on "XSI conformant" systems, it's always 1000000. (Have a look into
bits/time.h on a glibc system, the definition violates ANSI C...).
The second bug is the "ms" unit, I guess it should haven been "us".
If we assume that the unit is microseconds, then there's a 0 too many in
the scaling factor.
So here's a patch that should be as portable as it gets, with a sane
millisecond resolution. Tested on OpenBSD and Linux
Tobias
PS: please CC
--- tests/benchmark.c.orig Thu Apr 2 11:25:34 2009
+++ tests/benchmark.c Sat Mar 6 23:40:05 2010
@@ -27,6 +27,7 @@
#ifdef _WIN32
#include <windows.h>
#else
+#include <unistd.h>
#include <sys/times.h>
#endif
@@ -332,8 +333,9 @@
t = (t2 - t1)/10000;
snprintf (buf, sizeof buf, "%5.0fms", (double)t );
#else
+ long ticks = sysconf(_SC_CLK_TCK);
snprintf (buf, sizeof buf, "%5.0fms",
- (((double) (stopped_at - started_at))/CLOCKS_PER_SEC)*10000000);
+ (((double) (stopped_at - started_at))/ticks)*1000);
#endif
return buf;
}
More information about the Gcrypt-devel
mailing list