我正在将我的应用程序从unix移植到windows,但我遇到了麻烦。在我的应用程序中,我需要找到以微秒为单位的时间(由于它是一个高精度的应用程序,整个应用程序很大程度上依赖于它)。
之前我使用的是timespec结构,但windows中没有这样的东西。命令GetTickCount还不够,因为它返回以毫秒为单位的时间。我也在考虑QueryPerformanceFrequency。
有没有人碰巧知道一些尽可能与timespec相同的东西?
将来,我甚至可能还需要纳秒,这是我在windows中搜索过的都不支持的。
发布于 2011-12-21 07:39:11
例如,请参见How to realise long-term high-resolution timing on windows using C++?和C++ Timer function to provide time in nano seconds。
我在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微秒的粒度(在my机器上)。返回值以秒为单位,给出自函数第一次调用以来所经过的秒数。(我很晚才意识到这是我在a year ago上给出的答案)。
#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发布于 2015-10-13 16:33:26
可以在Windows,UNIX,Linux和任何不太现代的东西之间移植:std::chrono::high_resolution_clock。分辨率可能会有所不同,但您可以在编译时找出它是什么。在现代硬件上,纳秒当然是可能的。
请记住,纳秒精度实际上意味着亚米级精度。在光速下一纳秒只有30厘米。将您的计算机从机架顶部移动到底部实际上就是将其移动了几纳秒。
https://stackoverflow.com/questions/8583308
复制相似问题