为什么 Sleep(1) 的睡眠时间在 Windows 中似乎是可变的?

2024-04-11

上周,我需要测试一些不同的算法函数,为了让自己轻松起来,我添加了一些人工睡眠并简单地测量了时钟时间。像这样的东西:

start = clock();
for (int i=0;i<10000;++i)
   {
   ...
   Sleep(1);
   ...
   }
end = clock();

由于 Sleep 的参数以毫秒为单位表示,我预计总挂钟时间约为 10 秒(由于算法的原因,时间要高得多,但现在并不重要),这确实是我的结果。

今天早上,由于新的 Microsoft Windows 热修复,我不得不重新启动电脑,令我惊讶的是,Sleep(1) 不再需要 1 毫秒,而是大约 0.0156 秒。

所以我的测试结果完全搞砸了,因为总时间从 10 秒增加到大约 156 秒。

我们在几台 PC 上对此进行了测试,显然在某些 PC 上,一次睡眠的结果确实是 1 毫秒。在其他 PC 上,该时间为 0.0156 秒。

然后,过了一会儿,睡眠时间突然下降到 0.01 秒,然后一小时后又回到 0.001 秒(1 毫秒)。

这是 Windows 中的正常行为吗? Windows 是否在重新启动后的最初几个小时内处于“睡眠”状态,然后在一段时间后逐渐获得更高的睡眠粒度? 或者还有其他方面可以解释行为的变化吗?

在我的所有测试中,没有其他应用程序同时运行(或者:至少不占用任何 CPU)。

有任何想法吗?

操作系统是Windows 7。


我没有听说过分辨率本身会像这样跳跃,但一般来说,睡眠的分辨率遵循任务调度程序的时钟滴答。因此默认情况下通常为 10 或 15 毫秒,具体取决于 Windows 版本。您可以通过发出以下命令手动将其设置为 1 毫秒时间开始期间 https://msdn.microsoft.com/en-us/library/dd757624(v=vs.85).aspx.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Sleep(1) 的睡眠时间在 Windows 中似乎是可变的? 的相关文章

随机推荐