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

Pat*_*ick 2 windows sleep

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

start = clock();
for (int i=0;i<10000;++i)
   {
   ...
   Sleep(1);
   ...
   }
end = clock();
Run Code Online (Sandbox Code Playgroud)

由于睡眠的参数以毫秒表示,我预计总挂钟时间约为10秒(由于算法而大,因此现在不重要),这确实是我的结果.

今天早上我因为新的Microsoft Windows热修复而不得不重新启动我的电脑,令我惊讶的是睡眠(1)不再需要1毫秒,但大约需要0.0156秒.

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

我们在几台PC上进行了测试,显然在一些PC上,一次睡眠的结果确实是1 ms.在其他PC上它是0.0156秒.

然后,突然,一段时间后,睡眠时间下降到0.01秒,然后一小时后回到0.001秒(1毫秒).

这是Windows中的正常行为吗?Windows重启后的第一个小时是"困",然后在一段时间后逐渐获得更高的睡眠粒度?或者是否有任何其他方面可以解释行为的变化?

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

有任何想法吗?

操作系统是Windows 7.

500*_*ror 6

我没有听说过解决方案本身就像那样跳跃,但一般来说,睡眠的分辨率遵循任务调度器的时钟滴答.因此默认情况下,通常为10或15毫秒,具体取决于Windows的版本.您可以通过发出timeBeginPeriod手动将其设置为1毫秒.