time.sleep(..)的准确性会更改并影响循环性能,具体取决于是否正在运行其他进程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了time.sleep(..)的准确性会更改并影响循环性能,具体取决于是否正在运行其他进程相关的知识,希望对你有一定的参考价值。
我已经注意到某些奇怪的行为,它可能会或可能不会特定于我的系统。 (联想t430运行Windows 8)
使用此脚本:
import time
now = time.time()
while True:
then = now
now = time.time()
dif = now - then
print(dif)
time.sleep(0.01)
打开浏览器后,我得到以下输出(我认为是名义上的)。
但是,如果没有打开浏览器,我会发现每个循环的等待时间很长。
显然这是违反直觉的,因为我认为当您的并发过程较少时,任何人都希望性能更好。
对这些结果的任何见解或简单复制,将不胜感激。
编辑:有趣的是,我在这段代码中观察到了类似的延迟:
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。
我额外启动Windows 7以复制您的发现,我可以确认。
这是Windows,具有使用的计时器类型,默认分辨率为15.6 ms(最小0.5 ms)。应用程序可以更改当前分辨率(WinAPI函数:timeBeginPeriod),Chrome可以更改。
设置为1 ms-这是一个问题,因为这是系统范围的影响关于能源消耗。从那篇文章:此功能会影响Windows的全局设置。 Windows使用任何过程要求的最低值(即最高分辨率)。设置更高的分辨率可以提高超时精度等待功能的间隔。但是,它也可以减少总体系统性能,因为线程调度程序可以更多地切换任务经常。高分辨率也会阻止CPU电源管理系统进入省电模式。设置更高的分辨率不能提高高分辨率性能的准确性柜台。
[2014年Forbes中的一篇文章覆盖了Chrome中的bug,无论当前负载如何,该分辨率都将[[permanently
在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中获得实际分辨率。
在Ubuntu服务器中
对这些结果的任何见解或简单复制,将不胜感激。
以上是关于time.sleep(..)的准确性会更改并影响循环性能,具体取决于是否正在运行其他进程的主要内容,如果未能解决你的问题,请参考以下文章