使用短路评估的好处

10
boolean a = false, b = true;
if ( a && b ) { ... };
大多数编程语言中,由于a为false,所以b不会被计算,因此a && b不可能为真。我的问题是,短路是否从体系结构角度来看更慢?在流水线中,您只需等待结果以确定是否应评估b,还是最好使用嵌套的if语句?这有帮助吗?
此外,有人知道短路求值通常称为什么吗?我之所以问这个问题,是因为我发现我的编程朋友从未听说过短路求值,并表示它并不常见,也没有出现在许多语言中,并且在流水线中效率低下。我对最后一个问题不确定,所以向大家请教!
好的,我想用一个不同的例子来解释一下我的朋友可能的观点。他认为,由于在以下语句中同时计算:
```python result = (condition_a() and condition_b()) or condition_c() ```
必须先计算条件a和b,然后才能计算条件c。而如果使用嵌套的if语句,则可以在满足条件时立即计算条件c,并跳过其他条件的计算。这样做是否更快?
(a) if ( ( a != null ) && ( a.equals(b) ) ) { ... }

如果存在会导致系统崩溃的代码,那么没有短路计算的架构(因此不允许上述语句)将更快地处理这些语句:

(b) if ( ( a == 4 ) && ( b == 5 ) )

因为如果不能并行执行 (a),那么也就不能并行执行 (b)。在这种情况下,允许短路求值的语言比不允许短路求值的语言更慢。

我不知道这是否正确。

谢谢

15个回答

1
一个单线程是顺序执行的,所以如果你有两个if语句,第一个当然会在第二个之前被评估,所以我看不出有什么区别。我比嵌套的if语句更多地使用条件AND运算符(据我所知,这就是&&的称呼)。如果我想检查某些可能需要一段时间来评估的东西,我会先进行简单的测试,然后在条件语句之后再进行更难的测试。
a = obj.somethingQuickToTest() && obj.somethingSlowToTest();

似乎与之前没有任何不同

a = false;
if(obj.somethingQuickToTest())
   a = obj.somethingSlowToTest();


1

关于短路是否高效,流水线对性能影响不大。在可能有影响的情况下,只要这些测试没有副作用,编译器就可以并行测试多个条件。此外,现代CPU具有多种机制,可用于提高分支代码的管道性能。

嵌套的if语句将产生与短路&&相同的效果。

“短路评估”是它最常见的名称,你的朋友错了,认为它不常见;它非常普遍。


0
根据上下文,它也可以被称为"Guarding"。
我在几乎所有我工作所涉及的语言中都看到过它——这已经接近十种语言了。

惰性求值是一种不同的方式;它只在你确切知道其结果将被使用的时间和地点才会评估表达式。 - Sean

0

我对流水线技术一无所知,但短路求值是许多编程语言的常见特性(这也是我所知道的名称)。在C语言中,&&和其他运算符定义了一个序列点,就像分号运算符一样,因此我不认为短路求值比使用多个语句更低效。


0

我只听说过它被称为短路。在管道中,下一个操作是否依赖于if语句的结果?如果是这样,这将更加优化,因此每次不必测试两个值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接