我将我的应用程序从windows
移植到unix
,我遇到了问题。在我的应用程序中,我需要在几微秒内找到时间(整个应用程序在很大程度上依赖于它,因为它是一个高精度的应用程序)。
以前我使用timespec
结构,但是Windows不包含这样的东西。命令GetTickCount
是不够的,因为它以毫秒为单位返回时间。我也在想QueryPerformanceFrequency
。
是否有人碰巧知道与timespec
尽可能相同的内容?
将来我甚至可能需要纳秒,这是我在Windows中搜索的所有内容。
答案 0 :(得分:10)
例如,请参阅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微秒的粒度(在 我的 机器上)。返回值以秒为单位,并给出自首次调用函数以来经过的秒数。 (我姗姗来迟地意识到这是我给出的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
答案 1 :(得分:3)
Windows,UNIX,Linux和任何模糊现代的东西都可以移植:std::chrono::high_resolution_clock
。分辨率可能会有所不同,但您可以在编译时找到它的内容。在现代硬件上肯定可以实现纳秒。
请记住,纳秒精度实际上意味着亚米精度。光速下的纳秒只有30厘米。将计算机从机架顶部移到底部实际上是将它移动了几纳秒。