C++ windows的timespec等效项

C++ windows的timespec等效项,c++,c,windows,datetime,win32-process,C++,C,Windows,Datetime,Win32 Process,我正在将我的应用程序从unix移植到windows,我遇到了麻烦。在我的应用程序中,我需要找到以微秒为单位的时间(由于它是一个高精度的应用程序,所以整个应用程序严重依赖于它) 以前我使用的是timespec结构,但windows不包含这样的内容。命令GetTickCount不足以满足要求,因为它以毫秒为单位返回时间。我还想到了QueryPerformanceFrequency 有没有人会碰巧知道与timespec尽可能相同的东西 将来,我甚至可能需要纳秒,这是我在windows中搜索过的任何东西

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

以前我使用的是
timespec
结构,但windows不包含这样的内容。命令
GetTickCount
不足以满足要求,因为它以毫秒为单位返回时间。我还想到了
QueryPerformanceFrequency

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

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

例如,请参见和

我在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()不太可能有帮助。时钟单调,时钟进程不工作

Windows的其他可能性可能是:;请参阅维基百科的文章。而且,这在Windows XP中不可用

还要注意的是,在Linux中,clock()是进程时间,而在Windows中则是挂机时间

因此,一些示例代码,既适用于标准Unix,也适用于在Windows下运行的CYGWIN代码,其粒度约为50微秒(在my计算机上)。返回值以秒为单位,并给出自首次调用函数以来经过的秒数。(我后来才意识到这是我给出的答案)

\ifndef\uu CYGWIN32__
double RealElapsedTime(void){//第一次调用时返回0秒
静态结构timeval t0;
结构时间值电视;
gettimeofday(&tv,0);
如果(!t0.tv_秒)
t0=电视;
返回tv.tv_sec-t0.tv_sec+(tv.tv_usec-t0.tv_usec)/1000000。;
}
#否则
#包括
双RealElapsedTime(void){//在我的机器上大约50微秒
静态大整数频率,启动;
大整数计数;
if(!QueryPerformanceCounter(&count))
FatalError(“查询性能计数器”);
如果(!freq.QuadPart){//一次初始化
if(!QueryPerformanceFrequency(&freq))
FatalError(“查询性能频率”);
开始=计数;
}
返回(双重)(count.QuadPart-start.QuadPart)/freq.QuadPart;
}
#恩迪夫

可在Windows、UNIX、Linux和任何模糊的现代设备之间移植:。分辨率可能会有所不同,但您可以在编译时找到它是什么。纳秒在现代硬件上当然是可能的


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

QueryPerformanceCounter有什么问题?@kichik我听说它与双核cpu一起使用时会出现问题。不知道它是否完全正确(与vs2015、v14.0.xyz捆绑在一起)新的运行时包含一个定义timespec类型的头(实际上有三种不同的类型:_timespec32、_timespec64和timespec)。不幸的是,没有附带的宏(例如,_TIMESPEC_DEFINED)来测试这种类型(argh)的存在。总而言之,这似乎是一个可靠的答案,但我似乎无法弄清楚为什么会返回一个双精度值,或者它将代表什么。我知道你们找到了差异,然后除以频率。所以如果我假设double值是以秒为单位的,那么为了求微秒,我必须乘以一百万(1000000)。是这样吗?返回值以秒为单位,并给出自函数第一次调用以来经过的秒数。
“一些特殊的操作系统,其中tv_sec成员具有未签名类型。”
对于这些,上面的代码需要强制转换,或者假设时钟从不倒转。看,尤其是安德拉斯·瓦斯的。哦,这太棒了。非常感谢你的帮助!我真的很感激!
#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