Python time.sleep vs忙等待准确性

JDo*_*ong 9 python performance sleep wait

我正在使用python标准库中的time.sleep函数,发现它不适合亚毫秒延迟.从测试中我发现实际等待1到1毫秒等待1.1-1.2毫秒.实现忙碌等待使准确度达到1%以内.我用了:

def busy_wait(dt):   
    current_time = time.time()
    while (time.time() < current_time+dt):
        pass
Run Code Online (Sandbox Code Playgroud)

并且可以在降低1%准确度之前下降到0.0001秒.

我的主要问题是:

  • 为什么睡眠功能如此不准确(可能是C问题)?获得更好的CPU和更高的时钟速度会改变这个吗?
  • 为什么有人会睡觉?我看到的唯一优势是节能,仅限于嵌入式系统,不是吗?
  • 通过校准补偿睡眠的不准确性是否可行?像这样:
def sleep(dt):
    sleep(calibration_function(dt))

顺便说一句,我读到睡眠甚至不能很长时间等待:Python time.sleep()的上限? 我也在某处读到了制作一个更短时间间隔的循环来提高精度,但是当我想延迟0.01秒时,这是没用的.Karl Voigtland提到使用ctypes的nanosleep,但我觉得这有点过分,而且time.sleep应该做它的预期行为.

time.sleep是一个破碎的python功能?或者没有人关心准确的时间测量吗?

Bru*_*son 6

在Windows上,OS Sleep功能(Python必然使用)只能在当前定时器间隔的倍数上唤醒一个线程.通常,其范围在1.0毫秒至15.6毫秒之间.降低定时器间隔可以很方便,因为它允许更短的睡眠,但它浪费电力,正如我在本文中所写:

http://randomascii.wordpress.com/2013/07/08/windows-timer-resolution-megawatts-wasted/

忙碌的等待可能会提供更好的准确性,但通常是一个可怕的想法,因为它浪费更多的电力,并从更值得的任务窃取CPU时间:

https://randomascii.wordpress.com/2012/06/05/in-praise-of-idleness/

最后,忙等待的准确性取决于您用于获取当前时间的定时器功能,也可能取决于定时器间隔:

https://randomascii.wordpress.com/2013/05/09/timegettime-versus-gettickcount/

为什么你想睡这么短的时间?通常最好等待一些事情发生 - 等待事件 - 而不是等待如此短的时间段.