考虑以下两个循环,其中 N = 10^9 或大到足以注意到效率低下的值。
Loop x = 1 to N
total += A(x)
total += B(x)
或
Loop x = 1 to N
total += A(x)
Loop x=1 to N
total += B(x)
每个函数都接受 x,执行一些任意算术计算(例如 x^2 和 3x^3 或其他无关紧要的东西),然后返回一个值。
整体运行时间是否会有任何差异,如果有的话,什么时候不会出现这种情况?
最佳答案
每个循环需要四个 Action :
- 准备(每个循环一次)
- 检查停止条件(每次迭代一次)
- 执行循环体(每次迭代一次)
- 调整用于确定迭代是否应该继续的值(每次迭代一次)
当你有一个循环时,你只需为第 1、2 和 4 项“支付”一次;当您有两个循环时,您会为所有内容“支付”两次。
假设调用这两个函数的顺序并不重要,那么在大多数常见情况下,差异不会很明显。但是,在极少的循环非常紧密的情况下,单个循环将占用较少的 CPU 资源。其实常用的技术loop unwinding依赖于通过重复主体多次来减少循环期间每次迭代检查和设置操作在整个 CPU 负载中的份额,并通过相应的因子减少迭代次数。
关于performance - 这两个循环之间的运行时间是否存在差异,是否存在异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15190201/