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.