timespec相当于windows

我正在从unix移植我的应用程序到windows ,我遇到了一堵墙。 在我的应用程序中,我需要在几微秒内找到时间(整个应用程序在很大程度上依赖于它,因为它是一个高精度的应用程序)。

以前我使用的是timespec结构,但是Windows不包含这样的东西。 命令GetTickCount是不够的,因为它以毫秒为单位返回时间。 我也在考虑QueryPerformanceFrequency

有没有人碰巧知道与timespec尽可能相同的东西,将来我甚至可能需要纳秒,这在Windows支持中没有找到任何东西。

感谢任何人的帮助

例如,请参阅如何使用C ++在Windows上实现长期高分辨率计时? 和C ++ Timerfunction以纳秒为单位提供时间 。

我在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  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 

可在Windows,UNIX,Linux和任何模糊的现代之间移植: std::chrono::high_resolution_clock 。 分辨率可能会有所不同,但您可以在编译时找到它的内容。 在现代硬件上肯定可以实现纳秒。

请记住,纳秒级精度实际上意味着亚米级精度。 光速下的纳秒仅为30厘米。 将计算机从机架顶部移到底部实际上是将它移动几纳秒。