См., Например, Как реализовать долгосрочную синхронизацию с высоким разрешением для окон, используя C ++? и C ++ Функция таймера для предоставления времени в наносекундах .
Я провел некоторое тестирование с Cygwin под Windows XP: на моей машине гранулярность gettimeofday () составляет около 15 мсек (~ 1/64 сек). Что довольно грубо. И так же гранулярность:
* clock_t clock(void) (divisor CLOCKS_PER_SEC)
* clock_t times(struct tms *) (divisor sysconf(_SC_CLK_TCK))
Оба делителя равны 1000 (POSIX может иметь 1000000 для первого).
Кроме того, clock_getres (CLOCK_REALTIME, ...) возвращает 15 мсек, так что clock_gettime () вряд ли поможет. И CLOCK_MONOTONIC, и CLOCK_PROCESS_CPUTIME_ID не работают.
Другие возможности для Windows могут быть RDTSC ; см. статью в Википедии. И HPET , который недоступен в Windows XP.
Также обратите внимание, что в Linux часы () - это время процесса, а в Windows - время стены.
Таким образом, некоторые примеры кода, как для стандартного Unix, так и для кода CYGWIN, работающего под Windows, дают гранулярность около 50 микросекунд (на моей машине). Возвращаемое значение указывается в секундах и дает количество секунд, прошедших с момента первого вызова функции. (Я запоздало понял, что это был ответ, который я дал год назад ).
#ifndef __CYGWIN32__
double RealElapsedTime(void) { // returns 0 seconds first time called
static struct timeval t0;
struct timeval tv;
gettimeofday(&tv, 0);
if (!t0.tv_sec)
t0 = tv;
return tv.tv_sec - t0.tv_sec + (tv.tv_usec - t0.tv_usec) / 1000000.;
}
#else
#include <windows.h>
double RealElapsedTime(void) { // granularity about 50 microsecs on my machine
static LARGE_INTEGER freq, start;
LARGE_INTEGER count;
if (!QueryPerformanceCounter(&count))
FatalError("QueryPerformanceCounter");
if (!freq.QuadPart) { // one time initialization
if (!QueryPerformanceFrequency(&freq))
FatalError("QueryPerformanceFrequency");
start = count;
}
return (double)(count.QuadPart - start.QuadPart) / freq.QuadPart;
}
#endif