首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么短路逻辑算子被认为更快?

为什么短路逻辑算子被认为更快?
EN

Stack Overflow用户
提问于 2017-12-26 20:02:51
回答 1查看 621关注 0票数 0

这个问题不是关于优化代码,而是关于短路逻辑运算符和正常逻辑运算符的性能差异的技术问题,这可以归结为它们在硬件上的性能。

基本上,逻辑ANDOR需要一个周期,而短路评估则使用分支,可以占用不同的周期。现在我知道分支预测器可以提高评估的效率,但是我不认为它比1周期更快?

是的,如果正确的操作数是昂贵的,那么尝试不评估它是有益的。但是对于像X & (Y | Z)这样的简单条件,假设这些是原子变量,非短路逻辑运算符的执行速度可能会更快。我说的对吗?

我假设短路逻辑运算符使用分支(没有正式的来源,只是自我思考),因为在执行指令的同时,你怎么做这些跳跃呢?

EN

回答 1

Stack Overflow用户

发布于 2020-12-13 02:39:19

这已经很晚了,但由于这件事还没有得到答复(.),我要试一试。

您已经指出了分支预测,这在本质上是正确的。现代硬件还存在其他与硬件相关的问题,这些问题大多与指令级并行性和操作间的相互依赖有关。

在a为假的情况下,短路操作者要求对A和B进行评估,不对B进行评估。这导致我们回到分支和CPU管道刷新由于投机的执行。这样做的代价会越来越高,因为需要连续检查更多的条件。另一方面,由于存在多个物理ALU/FPU/AGUs等物理ALU/FPU/AGUs,CPU可以在同一个时钟周期内对“多个”指令进行评估,因此可以降低非短路操作的成本。

为了证明这一点,让我们看看程序集中最简单的例子:

代码语言:javascript
复制
a && b: 

cmp    a, 0
jne    LABEL_A
---more code---
LABEL_A:
cmp    b, 0
jne    RETURN_LABEL
 ---more code--- 

相对于..。(假设像setb这样的指令被用来夹紧到0,1)

代码语言:javascript
复制
a & b 

and   a, a, b
cmp   a, 0
jne   RETURN_LABEL
---more code---

这在生成的程序集本身中应该是不言而喻的。但是是的,你说得对,如果A是错误的,你绝对应该使用短路来避免昂贵的计算B。但即便如此,CPU还是可能会推测地为B执行测试。因此,基本上,很简单地说,你只能“使用短路运算符(原文如此!”)使情况更糟。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47983234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档