当前位置: 首页 > 知识库问答 >
问题:

短路逻辑运算符为什么要快

翟嘉志
2023-03-14

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

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

我假设短路逻辑运算符使用分支(没有官方来源,只是自己想的),因为如果不这样的话,你如何在按顺序执行指令的同时做出那些跳跃呢?

共有1个答案

娄鹤轩
2023-03-14

这是很晚了,但由于这还没有得到答复(……),我要去试试看。

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

一个短路操作员在A为假的情况下要求A和然后B被评估,B不被评估。这将使我们回到分支和CPU流水线由于投机执行而被刷新的问题上。需要连续检查的条件越多,成本就越高。另一方面,由于存在多个物理ALU/FPU/AGU等,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---

这在由此产生的html" target="_blank">程序集本身中应该是不言而喻的。但是是的,你说的没错,你绝对应该使用短路来避免在A为假的情况下昂贵的计算B。但即使这样,CPU也可能会推测性地执行B的测试。所以基本上,非常简单地说,你可以“通过使用短路操作符(原文如此!!!!!)只会使事情变得更糟”。

 类似资料:
  • 问题内容: 哪一组短路,这到底意味着复杂的条件表达式短路了? 问题答案: 在与运营商“短路”,这意味着如果没有必要,他们不评价的右手边。 在与运营商,如逻辑运算符时,始终评估两侧。 每个操作员只有一种短路情况,它们是: -不必知道右侧是什么,结果必须是 -不必知道右侧是什么,结果必须是 让我们在一个简单的示例中比较行为: 第二个版本使用非短路运算符,并将抛出,但第一个版本将无例外地返回;

  • 哪个集合是短路的,复杂条件表达式是短路的确切含义是什么?

  • 问题内容: 我可以在MySQL 5.5的子句中使用任何短路逻辑运算符(特别是短路和短路)吗?如果没有,那还有什么选择? 在这个小提琴中可以找到关于我的问题的抽象观点以及对我为什么需要它的解释: http://sqlfiddle.com/#!2/97fd1/3 实际上,我们正在数百个国家/地区的数以千计的城市中的数百万家书店中查找数百万本图书,这就是为什么我们无法接受我们发送的每个查询都收到不必要信

  • JavaScript 中有三个逻辑运算符:||(或),&&(与),!(非)。 虽然它们被称为“逻辑”运算符,但这些运算符却可以被应用于任意类型的值,而不仅仅是布尔值。它们的结果也同样可以是任意类型。 让我们来详细看一下。 ||(或) 两个竖线符号表示“或”运算符: result = a || b; 在传统的编程中,逻辑或仅能够操作布尔值。如果参与运算的任意一个参数为 true,返回的结果就为 tr

  • 本文向大家介绍什么是JavaScript中的逻辑运算符?,包括了什么是JavaScript中的逻辑运算符?的使用技巧和注意事项,需要的朋友参考一下 JavaScript支持以下逻辑运算符。假设变量A持有10,变量B持有20,那么, 序号 运算符和说明 1 &&(逻辑与) 如果两个操作数都不为零,则条件变为true。 例如:(A && B)是真的。 2 | | (逻辑或) 如果两个操作数中的任何一个