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.
This commit is contained in:
Daniel Micay 2014-10-16 17:02:18 -04:00 committed by Jason Evans
parent f69e2f6fda
commit d6384b09e1
2 changed files with 27 additions and 0 deletions

View File

@ -1,10 +1,20 @@
/* Simple timer, for use in benchmark reporting. */ /* Simple timer, for use in benchmark reporting. */
#include <unistd.h>
#include <sys/time.h> #include <sys/time.h>
#define JEMALLOC_CLOCK_GETTIME defined(_POSIX_MONOTONIC_CLOCK) \
&& _POSIX_MONOTONIC_CLOCK >= 0
typedef struct { typedef struct {
#if JEMALLOC_CLOCK_GETTIME
struct timespec tv0;
struct timespec tv1;
int clock_id;
#else
struct timeval tv0; struct timeval tv0;
struct timeval tv1; struct timeval tv1;
#endif
} timedelta_t; } timedelta_t;
void timer_start(timedelta_t *timer); void timer_start(timedelta_t *timer);

View File

@ -4,22 +4,39 @@ void
timer_start(timedelta_t *timer) 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); gettimeofday(&timer->tv0, NULL);
#endif
} }
void void
timer_stop(timedelta_t *timer) timer_stop(timedelta_t *timer)
{ {
#if JEMALLOC_CLOCK_GETTIME
clock_gettime(timer->clock_id, &timer->tv1);
#else
gettimeofday(&timer->tv1, NULL); gettimeofday(&timer->tv1, NULL);
#endif
} }
uint64_t uint64_t
timer_usec(const timedelta_t *timer) 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) + return (((timer->tv1.tv_sec - timer->tv0.tv_sec) * 1000000) +
timer->tv1.tv_usec - timer->tv0.tv_usec); timer->tv1.tv_usec - timer->tv0.tv_usec);
#endif
} }
void void