// Copyright Epic Games, Inc. All Rights Reserved. #include #include #include #if ZEN_PLATFORM_WINDOWS # include #elif ZEN_PLATFORM_LINUX # include # include #endif namespace zen { uint64_t GetHifreqTimerValue() { #if ZEN_PLATFORM_WINDOWS LARGE_INTEGER li; QueryPerformanceCounter(&li); return li.QuadPart; #else struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); return (uint64_t(ts.tv_sec) * 1000000ull) + (uint64_t(ts.tv_nsec) / 1000ull); #endif } uint64_t internalGetHifreqTimerFrequency() { #if ZEN_PLATFORM_WINDOWS LARGE_INTEGER li; QueryPerformanceFrequency(&li); return li.QuadPart; #else return 1000000ull; #endif } static uint64_t qpcFreq = internalGetHifreqTimerFrequency(); uint64_t GetHifreqTimerFrequency() { return qpcFreq; } uint64_t GetHifreqTimerFrequencySafe() { if (!qpcFreq) qpcFreq = internalGetHifreqTimerFrequency(); return qpcFreq; } ////////////////////////////////////////////////////////////////////////// #if !ZEN_PLATFORM_WINDOWS void Sleep(uint32_t ms) { usleep(ms * 1000U); } #endif ////////////////////////////////////////////////////////////////////////// // // Testing related code follows... // void timer_forcelink() { } TEST_CASE("Timer") { uint64_t s0 = GetHifreqTimerValue(); uint64_t t0 = GetCpuTimerValue(); Sleep(1000); uint64_t s1 = GetHifreqTimerValue(); uint64_t t1 = GetCpuTimerValue(); // double r = double(t1 - t0) / (s1 - s0); CHECK_NE(t0, t1); CHECK_NE(s0, s1); } } // namespace zen