Хотя приведенные выше ответы, безусловно, верны ( c'est la vie ), они не очень полезны.
Я провел некоторое тестирование с Cygwin под Windows XP: на моей машинегранулярность gettimeofday () составляет около 15 мсек (1/64 сек?).Который большой.Также как и гранулярность:
- clock_t clock (void) (делитель CLOCKS_PER_SEC)
- clock_t times (struct tms *) (делитель sysconf (_SC_CLK_TCK))
Оба делителя равны 1000 (у POSIX 1000000 для первого?).
Кроме того, clock_getres (CLOCK_REALTIME, ...) возвращает 15 мсек, так что clock_gettime () вряд ли поможет.И CLOCK_MONOTONIC и CLOCK_PROCESS_CPUTIME_ID не работают.
Другими возможными вариантами для CYGWIN могут быть RDTSC;см. статью в Википедии.И, возможно, HPET, но он недоступен в Windows XP.
Также обратите внимание, что в Linux clock () - это время процесса , в то время как в Windows это wall время.
Итак, некоторые примеры кода, как для стандартного Unix, так и для кода CYGWIN, работающего под Windows, что дает гранулярность около 50 микросекунд (на моем компьютере):
#if !CYGWIN
double realElapsedTime(void) { // returns 0 first time called
static struct timeval t0;
struct timeval tv;
gettimeofday(&tv, 0);
if (!t0.tv_sec) // one time initialization
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
static LARGE_INTEGER freq, start;
LARGE_INTEGER count;
if (!QueryPerformanceCounter(&count))
assert(0 && "QueryPerformanceCounter");
if (!freq.QuadPart) { // one time initialization
if (!QueryPerformanceFrequency(&freq))
assert(0 && "QueryPerformanceFrequency");
start = count;
}
return (double)(count.QuadPart - start.QuadPart) / freq.QuadPart;
}
#endif