【问题标题】:Why is the sleep-time of Sleep(1) seems to be variable in Windows?为什么 Sleep(1) 的睡眠时间在 Windows 中似乎是可变的?
【发布时间】:2010-10-25 21:41:57
【问题描述】:

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

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

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

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

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

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

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

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

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

有什么想法吗?

操作系统是 Windows 7。

【问题讨论】:

  • 睡眠前后(用椭圆表示)不能影响结果吗?

标签: windows sleep


【解决方案1】:

我没有听说过分辨率会像这样跳来跳去,但总的来说,睡眠的分辨率遵循任务调度程序的时钟滴答。因此,默认情况下通常为 10 或 15 毫秒,具体取决于 Windows 的版本。您可以通过发出timeBeginPeriod 手动将其设置为 1 毫秒。

【讨论】:

  • 是的,就是这样。显然,一些应用程序将粒度从 0.0156 秒(这似乎是默认值)更改为 0.001 秒(可能是 Office、Internet Explorer 或其他)。
【解决方案2】:

我猜是调度程序。每个操作系统都有一定的粒度。如果你要求它做比这更低的事情,结果并不完美。通过要求睡眠 1 毫秒(尤其是经常),调度程序可能会决定您不重要并让您睡得更久,或者您的睡眠时间可能会在您的时间片结束时运行。

睡眠呼叫是一个建议呼叫。它告诉操作系统您想要睡眠 X 时间。它可以小于 X(由于信号或其他原因),也可以更多(如您所见)。

另一个堆栈溢出问题有一个way to do it,但你必须使用winsock。

【讨论】:

    【解决方案3】:

    当您调用 Sleep 时,处理器会停止该线程,直到它可以恢复一次 >= 到调用的 Sleep 时间。有时由于线程优先级(在某些情况下会导致 Sleep(0) 导致您的程序无限期挂起)您的程序可能会在稍后恢复,因为为另一个线程分配了更多的处理器周期来工作(主要是 OS 线程具有更高的优先级)。

    【讨论】:

      【解决方案4】:

      我刚刚在Sleep Less Than One Millisecond 线程中写了一些关于 sleep() 函数的文字。 sleep() 函数的特性取决于底层硬件和多媒体定时器接口的设置。

      Windows 更新可能会改变这种行为,即 Windows 7 与 Vista 相比确实对事物的处理方式有所不同。请参阅我在该线程中的评论及其链接以了解有关 sleep() 函数的更多信息。

      【讨论】:

        【解决方案5】:

        很可能睡眠定时器的分辨率不够。

        当您按照Sleep 函数的文档中的说明调用timeGetDevCaps 函数时,您会得到什么样的分辨率?

        【讨论】:

        • timeGetDevCaps返回的信息总是最小1最大1000000。
        【解决方案6】:

        Windows 睡眠粒度通常为 16 毫秒,除非您或其他程序更改此设置,否则您会得到这个。当您在其他日子获得 1 毫秒的粒度和其他 16 毫秒的粒度时,其他一些程序可能会设置时间片(也对您的程序产生影响)。我认为我的 Labview 就是这样做的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-02
          • 2014-06-20
          • 1970-01-01
          • 2021-04-12
          相关资源
          最近更新 更多