22 #ifndef CTKHIGHPRECISIONTIMER_H
23 #define CTKHIGHPRECISIONTIMER_H
28 #undef _ctk_use_high_precision_timer_fallback
31 #include <mach/mach_time.h>
32 #elif defined(Q_OS_UNIX)
35 #ifndef _POSIX_MONOTONIC_CLOCK
36 #warning Monotonic clock support missing on this POSIX platform
37 #define _ctk_use_high_precision_timer_fallback
39 #elif defined(Q_OS_WIN)
42 #define _ctk_use_high_precision_timer_fallback
45 #ifdef _ctk_use_high_precision_timer_fallback
46 #warning ctkHighPrecisionTimer is using the slower QTime fallback
76 static double timeConvert;
78 #ifdef _ctk_use_high_precision_timer_fallback
80 #elif defined(Q_OS_MAC)
82 #elif defined(Q_OS_UNIX)
84 #elif defined(Q_OS_WIN)
85 LARGE_INTEGER timerFrequency;
86 LARGE_INTEGER startTime;
90 #ifdef _ctk_use_high_precision_timer_fallback
93 : startTime(QTime::currentTime())
99 startTime = QTime::currentTime();
104 return startTime.elapsed();
109 return startTime.elapsed() * 1000;
112 #elif defined(Q_OS_MAC)
117 if (timeConvert == 0)
119 mach_timebase_info_data_t timeBase;
120 mach_timebase_info(&timeBase);
121 timeConvert =
static_cast<double>(timeBase.numer) /
static_cast<double>(timeBase.denom) / 1000.0;
127 startTime = mach_absolute_time();
132 quint64 current = mach_absolute_time();
133 return static_cast<double>(current - startTime) * timeConvert / 1000.0;
138 quint64 current = mach_absolute_time();
139 return static_cast<double>(current - startTime) * timeConvert;
142 #elif defined(Q_OS_UNIX)
146 startTime.tv_nsec = 0;
147 startTime.tv_sec = 0;
152 clock_gettime(CLOCK_MONOTONIC, &startTime);
158 clock_gettime(CLOCK_MONOTONIC, ¤t);
159 return (
static_cast<qint64
>(current.tv_sec)*1000 + current.tv_nsec/1000/1000) -
160 (
static_cast<qint64
>(startTime.tv_sec)*1000 + startTime.tv_nsec/1000/1000);
166 clock_gettime(CLOCK_MONOTONIC, ¤t);
167 return (
static_cast<qint64
>(current.tv_sec)*1000*1000 + current.tv_nsec/1000) -
168 (
static_cast<qint64
>(startTime.tv_sec)*1000*1000 + startTime.tv_nsec/1000);
171 #elif defined(Q_OS_WIN)
177 if (!QueryPerformanceFrequency(&timerFrequency))
184 QueryPerformanceCounter(&startTime);
190 LARGE_INTEGER current;
191 QueryPerformanceCounter(¤t);
192 return (current.QuadPart - startTime.QuadPart) / (timerFrequency.QuadPart / 1000);
197 LARGE_INTEGER current;
198 QueryPerformanceCounter(¤t);
199 return (current.QuadPart - startTime.QuadPart) / (timerFrequency.QuadPart / (1000*1000));
A fast and high precision timer.