最近我在Stack Overflow(Python)上冲浪并看到this post Aaron Hall声称
持续运行while循环会消耗大量处理能力。添加睡眠周期(甚至只需一秒钟)可以大大减少这种使用。
这是真的吗?如果是这样,怎么样?同样的规则是否也适用于其他编程语言(即C ++)?
答案 0 :(得分:10)
TL; DR如果您正在轮询每分钟发生一次的事件,您可能不希望每隔纳秒检查一次。
是的,这是真的。在线程中休眠会降低该线程的CPU使用率。当线程休眠时,它几乎不占用任何CPU时间。
是的,只要使用操作系统本机线程API实现休眠,对于任何语言都是如此。
为了直观地考虑这一点,让我们从链接的问题中考虑该程序的简化版本:
while end_condition_expression:
if time_based_condition_expression:
do_something()
现在,让我们简化世界,并假设程序是处理器上运行的唯一进程。
我们还假设,基于时间的条件每分钟都是真的。我们还假设执行end_condition_expression
和time_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 ns = 600 ns 。这是该计划使用的非睡眠版本的百万分之一。
实际上,从睡眠调用开始有一些开销,并且cpu时间与其他进程共享,并且涉及调度程序,并且确切的cpu使用率与我的假设完全匹配,但是这个想法保持不变。