From e6440dfe40fb6edbf94d2b22ffbc17c102860001 Mon Sep 17 00:00:00 2001 From: Alfred Klomp Date: Tue, 9 Jan 2024 15:33:43 +0100 Subject: [PATCH] fixup! Benchmark: emulate clock_gettime(2) on Windows --- test/benchmark.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/test/benchmark.c b/test/benchmark.c index b3caa9a..5ba8ec3 100644 --- a/test/benchmark.c +++ b/test/benchmark.c @@ -13,7 +13,7 @@ #include #include -#ifdef _WIN32 +#if defined(_WIN32) || defined(_WIN64) # include # include #else @@ -66,7 +66,7 @@ bytes_to_mb (size_t bytes) static bool get_random_data (struct buffers *b, char **errmsg) { -#ifdef _WIN32 +#if defined(_WIN32) || defined(_WIN64) HCRYPTPROV hProvider = 0; if (!CryptAcquireContext(&hProvider, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) { @@ -130,18 +130,31 @@ timediff_sec (base64_timespec *start, base64_timespec *end) return (float)((diff * tb.numer) / tb.denom) / 1e9f; } -#elif defined(_WIN32) && !(defined(__MINGW32__) || defined(__MINGW64__)) -typedef struct timespec base64_timespec; +#elif defined(_WIN32) || defined(_WIN64) +typedef ULARGE_INTEGER base64_timespec; + static void base64_gettime (base64_timespec *o_time) { - timespec_get(o_time, TIME_UTC); + FILETIME current_time_ft; + + GetSystemTimePreciseAsFileTime(¤t_time_ft); + + o_time->LowPart = current_time_ft.dwLowDateTime; + o_time->HighPart = current_time_ft.dwHighDateTime; } static float timediff_sec (base64_timespec *start, base64_timespec *end) { - return (end->tv_sec - start->tv_sec) + ((float)(end->tv_nsec - start->tv_nsec)) / 1e9f; + // Timer resolution is 100 nanoseconds (10^-7 sec). + const float ssec = start->QuadPart / 10000000UL; + const float snsec = start->QuadPart % 10000000UL; + + const float esec = end->QuadPart / 10000000UL; + const float ensec = end->QuadPart % 10000000UL; + + return (esec - ssec) + (ensec - snsec) / 1e7f; } #else typedef struct timespec base64_timespec;