参见,例如,如何使用 C++ 在 Windows 上实现长期高分辨率计时?和C++ Timer 函数以纳秒为单位提供时间。
我在 Windows XP 下使用 Cygwin 进行了一些测试:在我的机器上,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 中,clock() 是进程时间,而在 Windows 中是挂钟时间。
因此,一些示例代码,既适用于标准 Unix,也适用于在 Windows 下运行的 CYGWIN 代码,其粒度约为 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