diff options
author | Yuri Kunde Schlesner <yuriks@yuriks.net> | 2015-02-15 15:49:27 -0200 |
---|---|---|
committer | Yuri Kunde Schlesner <yuriks@yuriks.net> | 2015-03-01 21:47:14 -0300 |
commit | dc8a3f8bc842df1b3eeeb5a283556ac644ab3183 (patch) | |
tree | 82bc4d610bd0b77ba6f2ac4e514e68d1c251b251 /src/common/profiler.h | |
parent | cd1fbfcf1b70e365d81480ec0f56db19ed02454f (diff) |
Profiler: Implement QPCClock to get better precision on Win32
MSVC 2013 (at least) doesn't use QueryPerformanceCounter to implement
std::chrono::high_resolution_clock, so it has bad precision. Manually
implementing our own clock type using it works around this for now.
Diffstat (limited to 'src/common/profiler.h')
-rw-r--r-- | src/common/profiler.h | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/common/profiler.h b/src/common/profiler.h index 53c4f6ea..3e967b4b 100644 --- a/src/common/profiler.h +++ b/src/common/profiler.h @@ -18,8 +18,26 @@ namespace Profiling { #define ENABLE_PROFILING 1 #endif -using Duration = std::chrono::nanoseconds; +#if defined(_MSC_VER) && _MSC_VER <= 1800 // MSVC 2013 +// MSVC up to 2013 doesn't use QueryPerformanceCounter for high_resolution_clock, so it has bad +// precision. We manually implement a clock based on QPC to get good results. + +struct QPCClock { + using duration = std::chrono::microseconds; + using time_point = std::chrono::time_point<QPCClock>; + using rep = duration::rep; + using period = duration::period; + static const bool is_steady = false; + + static time_point now(); +}; + +using Clock = QPCClock; +#else using Clock = std::chrono::high_resolution_clock; +#endif + +using Duration = Clock::duration; /** * Represents a timing category that measured time can be accounted towards. Should be declared as a |