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

上个星期,我需要testing一些不同的algorithmfunction,为了让自己更容易,我添加了一些人为的睡眠,并简单地测量了时钟的时间。 像这样的东西:

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

由于睡眠的参数是用毫秒来表示的,所以我预计总的挂钟时间大约为10秒(由于algorithm的原因,这个时间大了很多,但现在并不重要),这确实是我的结果。

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

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

我们在几台PC上testing了这一点,显然在一些PC上,一个Sleep的结果的确是1 ms。 在其他PC上是0.0156秒。

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

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

在我的所有testing中,没有其他的应用程序正在同时运行(或者:至less没有任何CPU)。

有任何想法吗?

操作系统是Windows 7。

我还没有听说过这样的解决方案,但总的来说,睡眠的解决方案遵循任务调度器的时钟周期。 所以默认情况下,通常是10或15毫秒,这取决于Windows的版本。 您可以通过发出timeBeginPeriod(1)手动设置为1 ms。

我猜这是调度器。 每个操作系统都有一定的粒度。 如果你要求做一些比这更低的事情,结果并不完美。 通过要求睡眠1ms(特别是经常),调度程序可能会决定你不重要,而且睡眠时间更长,或者睡眠时间可能会随着时间片的结束而增加。

睡眠电话是一个咨询电话。 它告诉操作系统你想睡X的时间。它可以小于X(由于信号或别的东西),或者可以更多(正如你所看到的)。

另一个堆栈溢出问题有办法做到这一点 ,但你必须使用winsock。

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

我只是在线程Sleep小于1毫秒的时间内写了一些关于sleep()函数的文字。 sleep()函数的特性取决于底层硬件和多媒体定时器接口的设置。

Windows更新可能会改变这种行为,即Windows 7的处理方式与Vista相比有所不同。 看到我的评论在该线程及其链接,以了解更多的邻接sleep()函数。

睡眠定时器很可能没有足够的分辨率。

当您按照Sleep功能文档中的说明调用timeGetDevCaps函数时,会得到什么样的解决方案?

Windows睡眠粒度通常是16毫秒,除非你的或其他程序改变了这个,否则你会得到这个。 当你有1毫秒的粒度和其他的16毫秒,其他一些程序可能设置时间片(也影响到你的程序)。 我认为我的Labview就是这样做的。