相当于窗口的Timespec

timespec equivalent for windows

本文关键字:Timespec 窗口 相当于      更新时间:2023-10-16

我正在将我的应用程序从unix移植到windows,我遇到了一个瓶颈。在我的应用程序中,我需要找到以微秒为单位的时间(整个应用程序严重依赖于它,因为它是一个高精度应用程序)。

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

有没有人碰巧知道一些与timespec尽可能相同的东西?

在未来,我甚至可能需要纳秒,这是我在windows中搜索不到的。

参见,例如,如何使用c++在windows上实现长期高分辨率定时?和c++定时器功能,提供以纳秒为单位的时间。

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

可在Windows, UNIX, Linux和任何模糊的现代之间移植:std::chrono::high_resolution_clock。分辨率可能会有所不同,但您可以在编译时找出它是什么。在现代硬件上,纳秒是完全可能的。

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