Performance 短路与性能

Performance 短路与性能,performance,boolean-logic,Performance,Boolean Logic,大多数语言使用短路和/或运算符。比如说 return foo() && bar(); 如果foo()返回false,则永远不会调用bar()。如果我们知道表达式的结果无论如何都是false,那么就没有必要调用bar() 据推测,这种行为最初是为了使代码运行更快而实现的。然而,从那时起,技术发生了变化。特别是,与其他操作相比,分支的成本更高,如果引入短路的话 所以我想知道:对于短路操作员来说,这仍然是一种性能提升吗 是的 想想看,如果你想做这样的事情: return IsOKTo

大多数语言使用短路和/或运算符。比如说

return foo() && bar();
如果foo()返回false,则永远不会调用bar()。如果我们知道表达式的结果无论如何都是false,那么就没有必要调用bar()

据推测,这种行为最初是为了使代码运行更快而实现的。然而,从那时起,技术发生了变化。特别是,与其他操作相比,分支的成本更高,如果引入短路的话

所以我想知道:对于短路操作员来说,这仍然是一种性能提升吗

是的

想想看,如果你想做这样的事情:

return IsOKToStart() && CalculateFirstPrimeGreaterThanTrilion();
第一个是一个简单的测试,另一个仍然需要几个月的时间来计算。

答案应该是“可能”

看看C#编译器完成的一些低级优化

他认为,至少,对一个简单布尔表达式的求值进行短路比只对整个表达式求值要昂贵得多。以下是相关摘录:

旁白:那不应该是temp1.HasValue&&temp2.HasValue吗?两个版本给出相同的结果;短路是否更有效?不一定!将两个bool合并在一起是非常快的,可能比执行额外的条件分支更快,以避免非常快的属性查找。代码当然更小。Roslyn使用非短路和非短路,我似乎记得早期的编译器也使用非短路和非短路


显然,在某些情况下,它是有用的。我想知道的是它是否普遍有用。我想知道,这家分行是否通常比我们正在避免的要贵。这家分行并不贵。仔细想想,程序一次只计算一个条件。在每个条件之后,只需进行一次额外的布尔检查,看看是否可以进行分支。这不需要任何费用,而且比调用函数要少得多。但是条件分支非常昂贵:“在非常低的级别(在硬件中)”。。。调用一个函数需要的远不止这些。在存储过程中会有很多调用。是的,一个函数将花费比分支更长的时间,但是如果第二部分足够简单,那么分支可能是浪费时间。