Skip to content

Commit

Permalink
Optimized timer code for macOS (#576)
Browse files Browse the repository at this point in the history
  • Loading branch information
Tillsunset committed Dec 15, 2022
1 parent fcab8f8 commit 058d11b
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 9 deletions.
8 changes: 5 additions & 3 deletions src/Common/precompiled.h
Original file line number Diff line number Diff line change
Expand Up @@ -351,22 +351,24 @@ 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();
static_assert(std::nano::num == 1, "This assumes period::num == 1.");
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
}

Expand Down
13 changes: 9 additions & 4 deletions src/Common/unix/platform.cpp
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
#include <stdint.h>
#include <time.h>
#include <cstdint>
#include <ctime>

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

}
5 changes: 3 additions & 2 deletions src/util/highresolutiontimer/HighResolutionTimer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand All @@ -20,7 +22,6 @@ HRTick HighResolutionTimer::getFrequency()
return m_freq;
}


uint64 HighResolutionTimer::m_freq = []() -> uint64 {
#if BOOST_OS_WINDOWS
LARGE_INTEGER freq;
Expand Down

0 comments on commit 058d11b

Please sign in to comment.