Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python time.sleep vs busy wait准确性_Python_Performance_Sleep_Wait - Fatal编程技术网

Python time.sleep vs busy wait准确性

Python time.sleep vs busy wait准确性,python,performance,sleep,wait,Python,Performance,Sleep,Wait,我在玩弄python标准库中的time.sleep函数,发现它不适合毫秒以下的延迟。通过测试,我发现它实际上要等待1.1-1.2毫秒,等待1毫秒。实现繁忙等待使准确率在1%以内。我用过: def busy_wait(dt): current_time = time.time() while (time.time() < current_time+dt): pass def busy_wait(dt): 当前时间=time.time() 而(time.

我在玩弄python标准库中的time.sleep函数,发现它不适合毫秒以下的延迟。通过测试,我发现它实际上要等待1.1-1.2毫秒,等待1毫秒。实现繁忙等待使准确率在1%以内。我用过:

def busy_wait(dt):   
    current_time = time.time()
    while (time.time() < current_time+dt):
        pass
def busy_wait(dt):
当前时间=time.time()
而(time.time()
在达到1%的准确度之前,可以降低到0.0001秒

我的主要问题是:

  • 为什么睡眠功能如此不准确(可能是C问题)?获得更好的CPU和更高的时钟速度会改变这一点吗
  • 为什么会有人使用睡眠?我看到的唯一优势,节能,仅限于嵌入式系统,不是吗
  • 用校准来补偿睡眠的不准确是否可行?像这样:
def睡眠(dt): 睡眠(校准功能(dt)) 作为旁白,我读到睡眠在长时间等待的情况下甚至不能正常工作: 我还读了一些关于缩短时间间隔以提高精度的文章,但当我想延迟0.01秒时,这是没有用的。提到使用ctypes的nanosleep,但我觉得这是过度的,时间。睡眠应该达到预期的效果


sleep是一个坏掉的python特性吗?还是没有人足够关心精确的时间测量?

这是一个重复的问题,但无论如何,我会尽我所能在这里回答它

sleep函数是一种操作系统调用,它与busywait的不同之处在于它不会阻塞线程。如果您有一个多线程脚本,它不应该阻止其他线程。
Windows中的睡眠功能不准确,因为它不是实时操作系统(不确定这意味着什么)。如果您严格要求等待的准确性,那么繁忙的等待是最佳选择。否则,
time.sleep()
可能是首选。操作系统对睡眠的调用不准确的原因可能是因为它依赖于操作系统在正确的时间返回,并且依赖于操作系统调度程序的精度。

在Windows上,操作系统睡眠函数(Python必须使用)只能以当前计时器间隔的倍数唤醒线程。通常这一范围在1.0 ms到15.6 ms之间。降低计时器间隔可能很方便,因为它可以缩短睡眠时间,但会浪费电,正如我在本文中所述:

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

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


你为什么要睡这么短的时间?通常情况下,最好是等待事件发生,而不是等待这么短的时间。

可能重复的是,我认为这是一个操作系统调用,但现在我想知道为什么在繁忙的等待更好的时候,他们会使用操作系统调用。繁忙的等待会消耗CPU时间并阻塞CPU。睡眠执行上下文切换,不会阻止其他执行(它会“阻止”您的执行)。一般来说,如果你真的需要精确的时间,你只需要忙着等待,即使这样,你仍然被限制在操作系统对CPU的需求上,这可能会影响到你……同样令人感兴趣的是问题和文章@JDong:busy waiting在一般情况下并不好,因为操作系统可以随时抢占你的程序。因此,根据CPU负载和调度程序的易变性,任何日光下的睡眠策略都可能是任意糟糕的。事实上,Python
time.sleep()
使用一个带有超时的
WaitForSingleObject()
调用来捕获等待期间的任何Ctrl-C(通过发出事件信号的
SetConsoleTrlHandler()
)应用程序是一种宏;我有一套动作要非常精确地模拟。我已经学会了如何在C中实现这一点,但还没有找到Python中的规范解决方案。我的问题有点无法回答,所以我现在接受你的回答。感谢您的见解。@schlenk感谢您提供有关time.sleep()实现的信息。关于超时何时过期的规则基本上与Sleep()的规则相同(因为调度程序仅在发生某些事情或计时器中断触发时运行),因此答案仍然适用。 def sleep(dt): sleep(calibration_function(dt))