首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >windows的timespec等效项

windows的timespec等效项
EN

Stack Overflow用户
提问于 2011-12-21 07:27:15
回答 2查看 16K关注 0票数 6

我正在将我的应用程序从unix移植到windows,但我遇到了麻烦。在我的应用程序中,我需要找到以微秒为单位的时间(由于它是一个高精度的应用程序,整个应用程序很大程度上依赖于它)。

之前我使用的是timespec结构,但windows中没有这样的东西。命令GetTickCount还不够,因为它返回以毫秒为单位的时间。我也在考虑QueryPerformanceFrequency

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

将来,我甚至可能还需要纳秒,这是我在windows中搜索过的都不支持的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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秒)。相当粗糙。粒度也是如此:

代码语言:javascript
复制
* 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上给出的答案)。

代码语言:javascript
复制
#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
票数 10
EN

Stack Overflow用户

发布于 2015-10-13 16:33:26

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8583308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档