From 058d11b49b8669438d48ca2b30aaabd0f34437ec Mon Sep 17 00:00:00 2001 From: Tillsunset <35825944+Tillsunset@users.noreply.github.com> Date: Thu, 15 Dec 2022 03:28:44 -0600 Subject: [PATCH] Optimized timer code for macOS (#576) --- src/Common/precompiled.h | 8 +++++--- src/Common/unix/platform.cpp | 13 +++++++++---- .../highresolutiontimer/HighResolutionTimer.cpp | 5 +++-- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/Common/precompiled.h b/src/Common/precompiled.h index dbfc5494..f17d47d4 100644 --- a/src/Common/precompiled.h +++ b/src/Common/precompiled.h @@ -351,10 +351,9 @@ bool match_any_of(T1 value, T2 compareTo, Types&&... others) #endif } - [[nodiscard]] static std::chrono::steady_clock::time_point tick_cached() noexcept { -#ifdef _WIN32 +#if BOOST_OS_WINDOWS // get current time static const long long _Freq = _Query_perf_frequency(); // doesn't change after system boot const long long _Ctr = _Query_perf_counter(); @@ -362,11 +361,14 @@ bool match_any_of(T1 value, T2 compareTo, Types&&... others) const long long _Whole = (_Ctr / _Freq) * std::nano::den; const long long _Part = (_Ctr % _Freq) * std::nano::den / _Freq; return (std::chrono::steady_clock::time_point(std::chrono::nanoseconds(_Whole + _Part))); -#else +#elif BOOST_OS_LINUX struct timespec tp; clock_gettime(CLOCK_MONOTONIC_RAW, &tp); return std::chrono::steady_clock::time_point( std::chrono::seconds(tp.tv_sec) + std::chrono::nanoseconds(tp.tv_nsec)); +#elif BOOST_OS_MACOS + return std::chrono::steady_clock::time_point( + std::chrono::nanoseconds(clock_gettime_nsec_np(CLOCK_MONOTONIC_RAW))); #endif } diff --git a/src/Common/unix/platform.cpp b/src/Common/unix/platform.cpp index a111a625..144d4f02 100644 --- a/src/Common/unix/platform.cpp +++ b/src/Common/unix/platform.cpp @@ -1,9 +1,14 @@ -#include -#include +#include +#include uint32_t GetTickCount() { - struct timespec ts; +#if BOOST_OS_LINUX + struct timespec ts; clock_gettime(CLOCK_MONOTONIC_RAW, &ts); - return (1000 * ts.tv_sec + ts.tv_nsec / 1000000); + return (1000 * ts.tv_sec + ts.tv_nsec / 1000000); +#elif BOOST_OS_MACOS + return clock_gettime_nsec_np(CLOCK_MONOTONIC_RAW) / 1000000; +#endif + } \ No newline at end of file diff --git a/src/util/highresolutiontimer/HighResolutionTimer.cpp b/src/util/highresolutiontimer/HighResolutionTimer.cpp index 510fdfa5..67ffa349 100644 --- a/src/util/highresolutiontimer/HighResolutionTimer.cpp +++ b/src/util/highresolutiontimer/HighResolutionTimer.cpp @@ -7,11 +7,13 @@ HighResolutionTimer HighResolutionTimer::now() LARGE_INTEGER pc; QueryPerformanceCounter(&pc); return HighResolutionTimer(pc.QuadPart); -#else +#elif BOOST_OS_LINUX timespec pc; clock_gettime(CLOCK_MONOTONIC_RAW, &pc); uint64 nsec = (uint64)pc.tv_sec * (uint64)1000000000 + (uint64)pc.tv_nsec; return HighResolutionTimer(nsec); +#elif BOOST_OS_MACOS + return HighResolutionTimer(clock_gettime_nsec_np(CLOCK_MONOTONIC_RAW)); #endif } @@ -20,7 +22,6 @@ HRTick HighResolutionTimer::getFrequency() return m_freq; } - uint64 HighResolutionTimer::m_freq = []() -> uint64 { #if BOOST_OS_WINDOWS LARGE_INTEGER freq;