use CLOCK_MONOTONIC in the timer if it's available
Linux sets _POSIX_MONOTONIC_CLOCK to 0 meaning it *might* be available,
so a sysconf check is necessary at runtime with a fallback to the
mandatory CLOCK_REALTIME clock.
diff --git a/test/include/test/timer.h b/test/include/test/timer.h
index 496072a..9ffbaef 100644
--- a/test/include/test/timer.h
+++ b/test/include/test/timer.h
@@ -1,10 +1,20 @@
/* Simple timer, for use in benchmark reporting. */
+#include <unistd.h>
#include <sys/time.h>
+#define JEMALLOC_CLOCK_GETTIME defined(_POSIX_MONOTONIC_CLOCK) \
+ && _POSIX_MONOTONIC_CLOCK >= 0
+
typedef struct {
+#if JEMALLOC_CLOCK_GETTIME
+ struct timespec tv0;
+ struct timespec tv1;
+ int clock_id;
+#else
struct timeval tv0;
struct timeval tv1;
+#endif
} timedelta_t;
void timer_start(timedelta_t *timer);
diff --git a/test/src/timer.c b/test/src/timer.c
index 36fbedd..338a9ef 100644
--- a/test/src/timer.c
+++ b/test/src/timer.c
@@ -4,22 +4,39 @@
timer_start(timedelta_t *timer)
{
+#if JEMALLOC_CLOCK_GETTIME
+ if (sysconf(_SC_MONOTONIC_CLOCK) <= 0)
+ timer->clock_id = CLOCK_REALTIME;
+ else
+ timer->clock_id = CLOCK_MONOTONIC;
+ clock_gettime(timer->clock_id, &timer->tv0);
+#else
gettimeofday(&timer->tv0, NULL);
+#endif
}
void
timer_stop(timedelta_t *timer)
{
+#if JEMALLOC_CLOCK_GETTIME
+ clock_gettime(timer->clock_id, &timer->tv1);
+#else
gettimeofday(&timer->tv1, NULL);
+#endif
}
uint64_t
timer_usec(const timedelta_t *timer)
{
+#if JEMALLOC_CLOCK_GETTIME
+ return (((timer->tv1.tv_sec - timer->tv0.tv_sec) * 1000000) +
+ (timer->tv1.tv_nsec - timer->tv0.tv_nsec) / 1000);
+#else
return (((timer->tv1.tv_sec - timer->tv0.tv_sec) * 1000000) +
timer->tv1.tv_usec - timer->tv0.tv_usec);
+#endif
}
void