【问题标题】:Does time.sleep help the processor?time.sleep 对处理器有帮助吗?
【发布时间】:2016-07-18 13:14:14
【问题描述】:

最近我在 Stack Overflow (Python) 上冲浪,看到 this post Aaron Hall 声称

不断运行 while 循环会消耗大量处理能力。添加睡眠时间(即使只有一秒钟)可以大大减少这种使用。

这是真的吗?如果是这样,怎么会?相同的规则是否也适用于其他编程语言(即 C++)?

【问题讨论】:

  • 在循环中添加睡眠通常意味着程序逻辑存在问题,但它确实有助于糟糕的代码。
  • 如果你想让程序在等待中断的同时永远运行怎么办?有更好的选择吗?
  • 如果 while 循环只是为了等待一些外部事件,则需要用某种旨在等待事件的多线程工具来替换它。如果它正在轮询磁盘以查找文件,那么 sleep then check 可能是最好的选择。但是简单地通过诸如 while (true) 之类的实际 cpu 指令是等待事件的最糟糕的方式。有没有更好的方法...取决于您正在等待的事件是什么。
  • 如果您正在等待中断,您的等待调用应该是阻塞的,这意味着您的执行线程在阻塞调用返回之前不会继续执行(消耗 CPU)。请参阅有关此主题的阻塞 I/O。
  • 我刚刚阅读了链接的问题。他正在等待的事件实际上是经过指定的时间,这正是 time.sleep 应该做的。

标签: python c++


【解决方案1】:

TL;DR 如果您要轮询每分钟发生一次的事件,您可能不想每纳秒检查一次。

是的,这是真的。在线程中休眠确实会减少该线程的 CPU 使用率。当线程休眠时,它几乎不会消耗任何 CPU 时间。

是的,只要睡眠是使用操作系统本机线程 API 实现的,这对于大多数语言都是如此。

为了直观地考虑这一点,让我们考虑链接问题中程序的简化版本:

while end_condition_expression:
    if time_based_condition_expression:
        do_something()

现在,让我们简化世界,假设程序是处理器上运行的唯一进程。

我们还假设,基于时间的条件每分钟一次为真。我们还假设执行end_condition_expressiontime_based_condition_expression 需要10 纳秒的cpu 时间。

这将在一分钟内消耗多少 cpu 时间?正好一分钟 == 60 000 000 000 纳秒。在整个过程中,cpu 使用率将是 100%。循环将迭代 60 亿次。

现在,考虑这个程序的变体:

while end_condition_expression:
    if time_based_condition_expression:
        do_something()
    sleep_for_a_second()

循环在一分钟内执行了多少次? 60 次迭代。这将在一分钟内消耗多少 cpu 时间? 60 * 10 纳秒 = 600 纳秒。这是该程序的非睡眠版本使用量的一亿分之一。

实际上,调用 sleep 有一点开销,而且 cpu 时间与其他进程共享,并且涉及到调度程序,确切的 cpu 使用情况不会完全符合我的假设,但想法保持不变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多