什么是timeGetTime的最佳替代品,以避免环绕?

Paw*_*dan 5 c++ windows time

timeGetTime似乎非常适合查询系统时间.但是,它的返回值仅为32位,因此每49天左右就会回绕一次.

在调用代码时检测翻转并不太难,但它增加了一些复杂性,并且(更糟)需要保持状态.

是否有一些替换timeGetTime没有这个环绕问题(可能通过返回64位值),并具有大致相同的精度和成本?

Len*_*ate 5

什么平台?

如果你在Vista或更高版本上运行,你可以使用GetTickCount64(),或者GetTickCount64()GetTickCount()计时器中合成你自己的...

我在我的博客上处理翻转问题GetTickCount()并合成一个GetTickCount64()不支持它的平台,关于测试非平凡的代码:http: //www.lenholgate.com/blog/2008/04/practical-testing-17 --- A-全新approach.html

  • FWIW,`GetTickCount` 和`timeGetTime` [不可互换](https://blogs.msdn.microsoft.com/larryosterman/2009/09/02/whats-the-difference-between-gettickcount-and-timegettime/) . 它们都有毫秒 _resolution_,但 GetTickCount 只有 10-16 ms _precision_,而 `timeGetTime` 通常具有 1-5 ms _precision_。 (2认同)

小智 5

除非您需要为超过49天的活动计时,否则您可以安全地忽略环绕.只需总是从当前timeGetTime()中减去前一个timeGetTime(),并且您将始终获得一个准确的增量测量时间,即使是在环绕中 - 只要您是总持续时间低于49天的计时事件.这一切都有效,因为计算机内的无符号模块化数学运算方式.

// this code ALWAYS works, even with wrap-around!
DWORD dwStart = timeGetTime();
// provided the event timed here has a duration of less than 49 days
DWORD dwDuration = timeGetTime()-dwStart;
Run Code Online (Sandbox Code Playgroud)

提示:查看TimeBeginPeriod(1L)以提高timeGetTime()的准确性.

但是......如果你想要一个64位版本的timeGetTime,这里是:

__int64 timeGetTime64() {
    static __int64 time64=0;
    // warning: if multiple threads call this function, protect with a critical section!
    return (time64 += (timeGetTime()-(DWORD)time64));
    }
Run Code Online (Sandbox Code Playgroud)

请注意,如果此函数每49天至少调用一次,则此函数将无法正确检测环绕.


Han*_*ant 1

不,跟踪翻转需要状态。它可以很简单,只需在每次回调时递增您自己的 64 位计数器即可。

想要以低至 1 毫秒的分辨率跟踪长达 49 天的时间段是很不寻常的。您必须担心经过这么长时间后准确性仍然存在。下一步是使用时钟,GetTickCount(64)、GetSystemTimeAsFileTime 的分辨率为 15.625 毫秒,并通过时间服务器保持准确。

  • 系统启动时就会开始计算转期,因此程序不必运行 49 天即可看到转期。 (12认同)