// high-resolution timing #ifndef Timer_hpp #define Timer_hpp ////////////////////////////////////////////////////////////////////// // Timer class using C++11 chrono #if __cplusplus >= 201100L || defined(__GXX_EXPERIMENTAL_CXX0X__) #include class Timer { // raw timer tick value for last query std::chrono::time_point tick; public: Timer() { // find time scale factor and set first tick tick = std::chrono::high_resolution_clock::now(); } double time() { // return time in seconds since last tick std::chrono::time_point last = tick; tick = std::chrono::high_resolution_clock::now(); return std::chrono::duration(tick - last).count(); } }; ////////////////////////////////////////////////////////////////////// // Timer class using Windows QueryPerformanceCounter #elif defined(_WIN32) #include class Timer { double scale; // scale factor from ticks to seconds LARGE_INTEGER tick; // raw timer tick value for last query public: Timer() { // find time scale factor and set first tick LARGE_INTEGER frequency; QueryPerformanceFrequency(&frequency); scale = 1e3 / double(frequency.QuadPart); QueryPerformanceCounter(&tick); } double time() { // return time in seconds since last tick LARGE_INTEGER last = tick; QueryPerformanceCounter(&tick); return scale * (tick.QuadPart - last.QuadPart); } }; ////////////////////////////////////////////////////////////////////// // Timer class using Linux clock_gettime #elif defined(__unix__) #include class Timer { struct timespec tick; // raw timer tick value for last query public: Timer() { // find time scale factor and set first tick clock_gettime(CLOCK_REALTIME, &tick); } double time() { // return time in seconds since last tick struct timespec last = tick; clock_gettime(CLOCK_REALTIME, &tick); return double(tick.tv_sec - last.tv_sec) + double(tick.tv_nsec - last.tv_nsec)*1e-9; } }; ////////////////////////////////////////////////////////////////////// // Timer class using Mac #elif defined(__APPLE__) #include class Timer { double scale; // scale factor from ticks to seconds uint64_t tick; // raw timer tick value for last query public: Timer() { // find time scale factor and set first tick mach_timebase_info_data_t mtb; mach_timebase_info(&mtb); scale = 1e-9 * double(mtb.numer) / double(mtb.denom); tick = mach_absolute_time(); } double time() { // return time in seconds since last tick uint64_t last = tick; tick = mach_absolute_time(); return scale * (tick - last); } }; #endif #endif