kpi*_*pie 24 python windows sleep lag python-3.x
我注意到一些奇怪的行为,这些行为可能特定于也可能不是特定于我的系统。(运行 Windows 8 的联想 t430)
使用这个脚本:
import time
now = time.time()
while True:
then = now
now = time.time()
dif = now - then
print(dif)
time.sleep(0.01)
Run Code Online (Sandbox Code Playgroud)
在浏览器打开的情况下,我得到以下输出(我认为是名义上的)。
但是,如果没有打开浏览器,我会观察到严重的每个循环延迟。
显然,这是违反直觉的,因为我认为当并发进程较少时,任何人都希望获得更好的性能。
对这些结果的任何见解或简单复制将不胜感激。
编辑: 有趣的是,我观察到与此代码类似的延迟:
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)
Run Code Online (Sandbox Code Playgroud)
虽然它确实提供了额外的洞察力 - 即潜在循环的一些实例是由于缺乏处理器可用性(通过打印 0 的计数来表示) - 我仍然注意到 15ms 的行为,其中打印的计数将高达 70k.. . 和 10 毫秒的行为,计数约为 40k。
Dar*_*aut 15
我额外启动了 Windows 7 来复制你的发现,我可以确认。
它是Windows 的东西,使用的计时器类型和默认分辨率为 15.6 毫秒(最小 0.5 毫秒)。应用程序可以更改当前分辨率(WinAPI 函数:timeBeginPeriod),而 Chrome会这样做。
此功能会影响全局 Windows 设置。Windows 使用任何进程请求的最低值(即最高分辨率)。设置更高的分辨率可以提高等待函数中超时间隔的准确性。但是,它也会降低整体系统性能,因为线程调度程序更频繁地切换任务。高分辨率还可以防止 CPU 电源管理系统进入省电模式。设置更高的分辨率不会提高高分辨率性能计数器的准确性。
福布斯2014 年的一篇文章涵盖了Chrome 中的一个错误,无论当前负载需要什么,该错误都会将分辨率永久设置为 1 毫秒——这是一个问题,因为它是一个系统范围的影响,对能源消耗有影响。从那篇文章:
在像 Windows 这样的操作系统中,事件通常被设置为每隔一段时间运行一次。为了省电,处理器在没有任何需要注意的时候休眠,并在预定义的时间间隔唤醒。这个时间间隔是 Chrome 在 Windows 中调整的,所以将它减少到 1.000 毫秒意味着系统比 15.625 毫秒更频繁地唤醒。事实上,在 1.000 毫秒时,处理器每秒唤醒 1000 次。默认值 15.625 毫秒意味着处理器每秒仅唤醒 64 次以检查需要注意的事件。
微软自己表示,1.000 毫秒的滴答率可能会使功耗增加“多达 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
Run Code Online (Sandbox Code Playgroud)
您可以cmd使用ClockRes小程序获得实际分辨率。
我在 windows 和 ubuntu 服务器(virtualbox)(没有浏览器)中尝试了相同的方法,但结果是相同的,我得到的平均值是
在 Ubuntu 服务器中
0.010122537612915039
0.010426998138427734
0.010067939758300781
0.010767221450805664
0.010728120803833008
0.010106086730957031
0.01068258285522461
0.010105609893798828
0.01118612289428711
0.010136842727661133
0.010585784912109375
0.010425567626953125
0.01014852523803711
0.010422945022583008
0.01010894775390625
Run Code Online (Sandbox Code Playgroud)
在 Windows 中
0.010767221450805664
0.010751485824584961
0.010716915130615234
0.010229110717773438
0.01016545295715332
0.010195255279541016
0.010723352432250977
0.010744094848632812
0.010716438293457031
0.010564565658569336
0.010889291763305664
0.010728597640991211
0.010579824447631836
0.010889530181884766
0.010567903518676758
0.010717153549194336
0.010735273361206055
Run Code Online (Sandbox Code Playgroud)
所以,在我看来,打开的浏览器和 python 的性能之间没有相关性
小智 6
对这些结果的任何见解或简单复制将不胜感激。
干得好:
使用您的代码和最新版本的 Chrome,我可以用几乎相同的结果确认这种行为。
我测量了平均花费的时间-
浏览器运行:0.01055538261329734
浏览器未运行:0.01563055389053695
我有大约 30 个打开的选项卡,但它们都空闲。目前,我想不出任何原因会发生这种情况。
期待进一步的见解。
虽然我无法在我的机器上重现这种行为,但我怀疑它可能是由动态处理器时钟(以及内存和系统总线时钟)引起的,例如,当您没有打开浏览器时,处理器以 1/ 2 最大时钟,但是一旦您启动浏览器,它就会达到最大时钟。您可以通过在高级电源选项中使用“最大\最小处理器状态\频率”来验证这一点,或者通过运行另一个产生许多进程的应用程序(这就是 Chrome 所做的)而不是浏览器来验证这一点,看看这是否会改变延迟。
| 归档时间: |
|
| 查看次数: |
615 次 |
| 最近记录: |