6

我正在将我的应用程序移植到windowsfromunix并且我遇到了障碍。在我的应用程序中,我需要以微秒为单位找到时间(整个应用程序在很大程度上依赖于它,因为它是一个高精度的应用程序)。

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

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

将来我什至可能也需要纳秒,这是我在 Windows 中搜索的任何内容都不支持的。

4

2 回答 2

10

参见,例如,如何使用 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
于 2011-12-20T23:39:11.440 回答
4

可在 Windows、UNIX、Linux 和任何隐约现代的东西之间移植:std::chrono::high_resolution_clock. 分辨率可能会有所不同,但您可以在编译时找出它是什么。纳秒在现代硬件上当然是可能的。

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

于 2015-10-13T08:33:26.417 回答