为什么Chrome会影响time.sleep()的准确性?

问题描述 投票:19回答:5

我已经注意到某些奇怪的行为,它可能会或可能不会特定于我的系统。 (联想t430运行Windows 8)

使用此脚本:

import time

now = time.time()
while True:
    then = now
    now = time.time()
    dif = now - then
    print(dif)
    time.sleep(0.01)

打开浏览器后,我得到以下输出(我认为是名义上的)。

enter image description here

但是,如果没有打开浏览器,我会发现每个循环的等待时间很长。

enter image description here

显然,这是违反直觉的,因为我认为当您的并发过程较少时,任何人都希望获得更好的性能。

对这些结果的任何见解或简单复制,将不胜感激。

编辑:有趣的是,我在这段代码中观察到了类似的延迟:

import time

now = time.time()

def newSleep(mark,duration):
    count = 0
    while time.time()-mark < duration:
        count+=1
    print(count)


while True:
    then = now
    now = time.time()
    dif = now - then
    print(dif)
    #time.sleep(0.01)
    newSleep(now,0.01)

虽然它确实提供了更多的见解-这是潜在循环的某些实例是由于缺乏处理器可用性(注意到正在打印的计数为0)-我仍然注意到15ms的行为,其中打印的计数将高达70k ...以及10ms的行为,计数约为40k。

python python-3.x windows sleep lag
5个回答
13
投票

我额外启动Windows 7以复制您的发现,我可以确认。

这是Windows,使用的计时器类型,默认分辨率为15.6 ms(最小0.5 ms)。应用程序可以更改当前分辨率(WinAPI函数:timeBeginPeriod),Chrome可以更改。

此功能会影响Windows的全局设置。 Windows使用任何过程要求的最低值(即最高分辨率)。设置更高的分辨率可以提高超时精度等待功能的间隔。但是,它也可以减少总体系统性能,因为线程调度程序可以更多地切换任务经常。高分辨率也会阻止CPU电源管理系统进入省电模式。设置更高的分辨率不能提高高分辨率性能的准确性柜台。

[2014年Forbes中的一篇文章覆盖了Chrome中的bug,无论当前负载如何,该分辨率都将[[permanently

设置为1 ms-这是一个问题,因为这是系统范围的影响关于能源消耗。从那篇文章:
在Windows之类的操作系统中,事件通常设置为间隔运行。至省电,处理器在不需要注意的情况下进入睡眠状态,并且以预定义的间隔唤醒。 Chrome会调整此间隔Windows,因此将其减小到1.000ms意味着系统正在唤醒比在15.625ms处更频繁。实际上,在1.000ms处处理器每秒醒来1000次。默认值15.625ms表示处理器每秒仅唤醒64次以检查所需的事件注意。

Microsoft本身说1.000ms的滴答速度可能会增加功率消费减少了“多达25%”。

您可以使用time.get_clock_info()从Python获取默认分辨率。

namespace = time.get_clock_info('time') namespace.adjustable # True namespace.implementation # 'GetSystemTimeAsFileTime()' namespace.monotonic # False namespace.resolution # 0.015600099999999999

您可以使用cmd小程序从ClockRes中获得实际分辨率。

7
投票
我在Windows和ubuntu server(virtualbox)(没有浏览器)中都尝试过相同的方法,但是结果是相同的,平均而言,我得到的结果是这样的>]

在Ubuntu服务器中


5
投票
对这些结果的任何见解或简单复制,将不胜感激。

4
投票
虽然我无法在计算机上重现此行为,但我怀疑它可能是由动态处理器时钟(以及内存和系统总线时钟)引起的,例如当您没有打开浏览器时,处理器以最大时钟的1/2运行,但是一旦启动浏览器,它将达到最大时钟。您可以通过在Advanced Power Options(高级电源选项)中使用“ Maximum \ minimum Processor state / frequency(最大处理器状态\频率)”或运行另一个会产生许多进程的应用程序(这是Chrome所做的)而不是浏览器来运行,以查看是否更改了延迟,来验证这一点。

1
投票
我写了类似的代码并获得了相似的输出,
© www.soinside.com 2019 - 2024. All rights reserved.