timespec相当于windows

时间:2011-12-20 23:27:15

标签: c++ c windows datetime win32-process

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

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

是否有人碰巧知道与timespec尽可能相同的内容?

将来我甚至可能需要纳秒,这是我在Windows中搜索的所有内容。

2 个答案:

答案 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厘米。将计算机从机架顶部移到底部实际上是将它移动了几纳秒。