这个问题不是关于优化代码,而是关于短路逻辑运算符和正常逻辑运算符的性能差异的技术问题,这可以归结为它们在硬件上的性能。
基本上,逻辑AND和OR需要一个周期,而短路评估则使用分支,可以占用不同的周期。现在我知道分支预测器可以提高评估的效率,但是我不认为它比1周期更快?
是的,如果正确的操作数是昂贵的,那么尝试不评估它是有益的。但是对于像X & (Y | Z)这样的简单条件,假设这些是原子变量,非短路逻辑运算符的执行速度可能会更快。我说的对吗?
我假设短路逻辑运算符使用分支(没有正式的来源,只是自我思考),因为在执行指令的同时,你怎么做这些跳跃呢?
发布于 2020-12-13 02:39:19
这已经很晚了,但由于这件事还没有得到答复(.),我要试一试。
您已经指出了分支预测,这在本质上是正确的。现代硬件还存在其他与硬件相关的问题,这些问题大多与指令级并行性和操作间的相互依赖有关。
在a为假的情况下,短路操作者要求对A和B进行评估,不对B进行评估。这导致我们回到分支和CPU管道刷新由于投机的执行。这样做的代价会越来越高,因为需要连续检查更多的条件。另一方面,由于存在多个物理ALU/FPU/AGUs等物理ALU/FPU/AGUs,CPU可以在同一个时钟周期内对“多个”指令进行评估,因此可以降低非短路操作的成本。
为了证明这一点,让我们看看程序集中最简单的例子:
a && b:
cmp a, 0
jne LABEL_A
---more code---
LABEL_A:
cmp b, 0
jne RETURN_LABEL
---more code--- 相对于..。(假设像setb这样的指令被用来夹紧到0,1)
a & b
and a, a, b
cmp a, 0
jne RETURN_LABEL
---more code---这在生成的程序集本身中应该是不言而喻的。但是是的,你说得对,如果A是错误的,你绝对应该使用短路来避免昂贵的计算B。但即便如此,CPU还是可能会推测地为B执行测试。因此,基本上,很简单地说,你只能“使用短路运算符(原文如此!”)使情况更糟。
https://stackoverflow.com/questions/47983234
复制相似问题