Windows 7和Windows 10之间的定时器差异

3
我有一个应用程序,我在其中使用MinGW实现的 gettimeofday 以实现在Win7上的“精确”定时(~ 1ms精度)。它可以正常工作。
然而,在Win10上使用相同的代码(甚至是相同的*.exe)时,精度急剧降低到著名的15.6ms精度,这对我来说不够。
两个问题: - 您是否知道这些差异的根本原因?(是操作系统配置/“特性”吗?) - 如何解决?或者,更好的方法,是否有与操作系统配置无关的精确计时器?
注: std :: chrono :: high_resolution_clock 似乎也存在相同的问题(至少在Win10上显示15.6ms限制)。

2
15.6 是正常值,是你的 Win7 安装出了问题。调用 timeBeginPeriod() 或使用 QueryPerformanceCounter() 来获得亚微秒级的精度。QPF 是最好的选择。 - Hans Passant
“不良行为”如何表现更好?这是来自配置选项吗? - cyrobin
1
“正常”和“更好”的目标是相反的。它对电源使用不利,会迅速耗尽笔记本电池。通常不是配置问题,而是一个调用timeBeginPeriod()函数的程序或驱动程序。Chrome因此而臭名昭著。在Win7上运行powercfg -energy以查找问题制造者。 - Hans Passant
哦,从我测试过的各种不同的计算机配置来看,电源使用设置是有道理的。你们结合起来的评论回答了我问题的所有方面。谢谢。 - cyrobin
1个回答

3

根据Hans Passant的评论和我自己的额外测试,这里是一个更可靠的答案:

在Windows上,15.6毫秒(1/64秒)的限制是众所周知的并且是默认行为。虽然可以通过调用timeBeginPeriod()将限制降低(例如到1毫秒),但我们不建议这样做,因为它会影响全局系统计时器分辨率和导致功耗增加。例如,Chrome以此闻名。因此,由于计时器分辨率的全局性质,即使没有明确要求,也可能观察到1毫秒的精度,因为有第三方程序存在。

此外,请注意 std::chrono::high_resolution_clock 在 Windows 上没有有效的行为(无论是在Visual Studio还是MinGW环境中)。因此,您不能指望这个接口成为跨平台解决方案,而且15.625毫秒的限制仍然适用。
那么,我们该怎么处理呢?嗯,一个人可以使用 timeBeginPeriod() 来增加某些计时器的精度,但是我们不建议这样做: 似乎最好使用 QueryPerformanceCounter()(QPC),这是微软根据 获取高分辨率时间戳或测量时间间隔 的原生代码的主要 API。请注意,GPC 计算经过的时间(而不是 CPU 周期)。以下是使用示例:
LARGE_INTEGER StartingTime, EndingTime, ElapsedMicroseconds;
LARGE_INTEGER Frequency;

QueryPerformanceFrequency(&Frequency); 
QueryPerformanceCounter(&StartingTime);

// Activity to be timed

QueryPerformanceCounter(&EndingTime);
ElapsedMicroseconds.QuadPart = EndingTime.QuadPart - StartingTime.QuadPart;


//
// We now have the elapsed number of ticks, along with the
// number of ticks-per-second. We use these values
// to convert to the number of elapsed microseconds.
// To guard against loss-of-precision, we convert
// to microseconds *before* dividing by ticks-per-second.
//

ElapsedMicroseconds.QuadPart *= 1000000;
ElapsedMicroseconds.QuadPart /= Frequency.QuadPart;

根据Microsoft,QPC在多核/多线程环境中也适用,但可能不够精确/明确:
当您比较从不同线程获取的性能计数器结果时,请考虑值相差±1个节拍的值具有模糊的排序。如果时间戳来自同一线程,则不适用±1个节拍的不确定性。在此上下文中,术语“节拍”是指等于1÷(从QueryPerformanceFrequency获得的性能计数器的频率)的时间段。
作为额外资源,微软还提供了一个如何/为什么使用QPC的FAQ和一个关于Windows中的时钟/定时的解释

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接