* DEALINGS IN THE SOFTWARE.
*/
-#if defined(HAVE_CLOCK_GETTIME)
-#define USE_CLOCK_GETTIME
-#include <time.h>
-#elif defined(__MACH__) && __MACH__ == 1
-#define USE_MACH_ABSOLUTE_TIME
-#include <mach/mach_time.h>
-#else
-/* gettimeofday() - a last resort */
-#include <sys/time.h>
-#endif
+#include "config.h"
-#include <stdlib.h>
-#include <string.h>
+#include <assert.h>
#include <stdio.h>
#include "bench.h"
+#include "../src/utils.h"
-static void
-set_bench_time(struct bench_time *dest, long seconds, long milliseconds)
-{
- dest->seconds = seconds;
- dest->milliseconds = milliseconds;
-}
-
-static void
-normalize_bench_time(struct bench_time *obj)
-{
- if (obj->milliseconds >= 0) {
- return;
- }
- obj->milliseconds += 1000000;
- obj->seconds--;
-}
+#ifndef _WIN32
+#include <sys/time.h>
+#else
+#include <windows.h>
+#include <stdint.h>
-void
-bench_timer_reset(struct bench_timer *self)
-{
-#if defined(USE_MACH_ABSOLUTE_TIME)
- mach_timebase_info_data_t info;
- if (mach_timebase_info(&info) == 0) {
- self->scaling_factor = info.numer / info.denom;
- }
-#endif
- self->start.seconds = 0L;
- self->start.milliseconds = 0L;
- self->stop.seconds = 0L;
- self->stop.milliseconds = 0L;
-}
+struct timeval {
+ long tv_sec, tv_usec;
+};
-void
-bench_timer_start(struct bench_timer *self)
+static int
+gettimeofday(struct timeval *tv, void *unused)
{
-#if defined(USE_CLOCK_GETTIME)
- struct timespec val;
+ static const uint64_t EPOCH = ((uint64_t) 116444736000000000ULL);
- (void)clock_gettime(CLOCK_MONOTONIC, &val);
+ SYSTEMTIME system_time;
+ FILETIME file_time;
+ uint64_t t;
- /* With conversion from nanosecond to millisecond */
- set_bench_time(&self->start, val.tv_sec, val.tv_nsec / 1000);
-#elif defined(USE_MACH_ABSOLUTE_TIME)
- uint64_t val;
+ GetSystemTime(&system_time);
+ SystemTimeToFileTime(&system_time, &file_time);
+ t = (uint64_t) file_time.dwLowDateTime;
+ t += ((uint64_t) file_time.dwHighDateTime) << 32;
- val = mach_absolute_time();
+ tv->tv_sec = (long) ((t - EPOCH) / 10000000L);
+ tv->tv_usec = (long) (system_time.wMilliseconds * 1000);
+ return 0;
+}
+#endif
- /* With conversion from nanosecond to millisecond */
- set_bench_time(&self->start,
- self->scaling_factor * val / 1000000000,
- self->scaling_factor * val % 1000000000 / 1000);
-#else
+void
+bench_start(struct bench *bench)
+{
struct timeval val;
-
- (void)gettimeofday(&val, NULL);
-
- set_bench_time(&self->start, val.tv_sec, val.tv_usec);
-#endif
+ (void) gettimeofday(&val, NULL);
+ bench->start = (struct bench_time) {
+ .seconds = val.tv_sec,
+ .microseconds = val.tv_usec,
+ };
}
void
-bench_timer_stop(struct bench_timer *self)
+bench_stop(struct bench *bench)
{
-#if defined(USE_CLOCK_GETTIME)
- struct timespec val;
-
- (void)clock_gettime(CLOCK_MONOTONIC, &val);
-
- /* With conversion from nanosecond to millisecond */
- set_bench_time(&self->stop, val.tv_sec, val.tv_nsec / 1000);
-#elif defined(USE_MACH_ABSOLUTE_TIME)
- uint64_t val;
-
- val = mach_absolute_time();
-
- /* With conversion from nanosecond to millisecond */
- set_bench_time(&self->stop,
- self->scaling_factor * val / 1000000000,
- self->scaling_factor * val % 1000000000 / 1000);
-#else
struct timeval val;
-
- (void)gettimeofday(&val, NULL);
-
- set_bench_time(&self->stop, val.tv_sec, val.tv_usec);
-#endif
+ (void) gettimeofday(&val, NULL);
+ bench->stop = (struct bench_time) {
+ .seconds = val.tv_sec,
+ .microseconds = val.tv_usec,
+ };
}
void
-bench_timer_get_elapsed_time(struct bench_timer *self, struct bench_time *result)
+bench_elapsed(const struct bench *bench, struct bench_time *result)
{
- result->seconds = self->stop.seconds - self->start.seconds;
- result->milliseconds = self->stop.milliseconds - self->start.milliseconds;
+ result->seconds = bench->stop.seconds - bench->start.seconds;
+ result->microseconds = bench->stop.microseconds - bench->start.microseconds;
+ if (result->microseconds < 0) {
+ result->microseconds += 1000000;
+ result->seconds--;
+ }
}
char *
-bench_timer_get_elapsed_time_str(struct bench_timer *self)
+bench_elapsed_str(const struct bench *bench)
{
struct bench_time elapsed;
char *buf;
+ int ret;
- bench_timer_get_elapsed_time(self, &elapsed);
- normalize_bench_time(&elapsed);
- asprintf(&buf, "%ld.%06ld", elapsed.seconds, elapsed.milliseconds);
+ bench_elapsed(bench, &elapsed);
+ ret = asprintf(&buf, "%ld.%06ld", elapsed.seconds, elapsed.microseconds);
+ assert(ret >= 0);
return buf;
}