繁体   English   中英

为什么在Windows中time.sleep()这么慢?

[英]Why time.sleep() is so slow in Windows?

我循环1000次,延时1ms,并计算总时间。 总时间是15.6秒而不是1秒,这非常有趣。当我打开Goog​​le Chrome浏览器浏览某些网站时,总运行时间为1秒。 另外,它也可以与Macbook一起运行。 我想知道我需要采取哪种解决方案来解决此问题? 请尝试在没有打开Chrome的情况下再次运行它,以查看其中的区别。 它在我的系统上打开Quora或Reddit或Stackoverflow时正常运行。

from timeit import default_timer as timer
import time
start = timer()
for i in range(1000):
    time.sleep(0.001)

end = timer()
print ("Total time: ", end - start)

编辑:我没有在Python上运行它。 我刚刚打开Chrome浏览器并浏览了一些网站,以加快时间延迟。

更新:关于Windows的计时器分辨率。 因此,基本上,Chrome将计时器分辨率从15.6ms更改为1ms。 这篇文章很好地解释了: https : //randomascii.wordpress.com/2013/07/08/windows-timer-resolution-megawatts-wasted/

我终于弄明白了。 非常感谢您的评论。 这些给了我解决的提示。 为了解释为什么会发生这种情况,Windows操作系统将其默认计时器分辨率设置为15.625 ms或64 Hz,足以满足大多数应用程序的需要。 但是,对于需要非常短的采样速率或时间延迟的应用,那么15.625 ms是不够的。 因此,当我自己运行程序时,它在15.6 s内停留了1000分。 但是,当打开Chrome时,更高分辨率的计时器被触发并更改为1 ms而不是15.6,这导致我的程序按预期运行。

因此,为了解决该问题,我需要调用一个名为timeBeginPeriod(period)的Windows函数来更改解析计时器。 幸运的是,python通过提供ctypes库使我更容易修复它。 最终代码如下:

from time import perf_counter as timer
import time
from ctypes import windll #new

timeBeginPeriod = windll.winmm.timeBeginPeriod #new
timeBeginPeriod(1) #new

start = timer()
for i in range(1000):
    print (i)
    time.sleep(0.001)

end = timer()
print ("Total time: ", end - start)

警告:我读到了如此高的计时器分辨率将如何影响整体性能以及电池。 我还没有看到任何事情发生,Windows Task Manage上的Activity上的CPU使用率似乎也没有令人感到不知所措。 但是请记住,如果您的应用程序碰巧会引起某些奇怪的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM