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:
parent
f69e2f6fda
commit
d6384b09e1
@ -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);
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user