'if-conditions'的顺序是否会影响性能?
假设订单很重要,此代码if (slowMethod() && fastMethod())
将慢于if (fastMethod() && slowMethod())
。
我认为顺序很重要,因为编译器不分析条件的执行时间。但我不确定。
答案 0 :(得分:5)
这两个条件将按此顺序进行评估,但第二个条件只会在第一个条件为真的情况下进行评估 - 所以乍一看,将fastMethod
放在首位可能会更好。
但是从性能角度来看,顺序还应考虑每个表达式的概率:尽管fastMethod
更快,但如果它几乎总是正确且slowMethod
几乎总是假的,您可能想先测试slowMethod
。
示例,假设:
fastMethod
需要1毫秒,80%的时间都会返回slowMethod
需要3毫秒,10%的时间返回正确然后:
fastMethod && slowMethod
平均需要3.4毫秒(20%的时间为1毫秒,80%的时间为4毫秒)slowMethod && fastMethod
平均需要3.1毫秒(90%的时间为3毫秒,10%的时间为4毫秒)最后,JIT编译器和CPU非常擅长优化条件,有时会导致违反直觉的性能结果。只有通过对特定用例进行基准测试/分析才能获得对问题的明确答案。
答案 1 :(得分:3)
&&
运算符(以及||
运算符)执行短路。这意味着,如果您有两个操作数A
和B
,而A
原来是false
,那么评估B
在{{1}中没有意义无论A && B
的值是什么,结果都是B
。
但这并不意味着你总是应该在false
之后放置slowMethod()
。
比如说fastMethod()
需要0.01秒,但对于99.9%的情况,结果为fastMethod()
,true
需要1.0秒,但slowMethod()
为true
50%的案例。
然后fastMethod() && slowMethod()
方法的平均运行时间为:
t(fast_slow) == 0.01 + 0.999 * 1.0 = 1.009
对于slowMethod() && fastMethod()
方法,我们得到:
t(slow_fast) = 1.0 + 0.5 * 0.01 = 1.005
短路不仅用于提高性能。它还可以用于以优雅的方式防范异常。例如,我们可以将其用作:
Object[] data = ...
if (data.length > 2 && data[2] != null) {
}
如果我们以另一种方式做到这一点,它可能会使索引超出界限,而这里第一个条件检查数组是否有足够的元素。
答案 2 :(得分:1)
if (fastMethod() && slowMeothod())
是更快的方法。
对于&&首先计算运算符左边的表达式,如果这是假的,那么表达式将完成,因为它知道它不需要评估右侧,这意味着你想要更快评估的表达式&&
的左侧。
如果需要评估两个表达式,则可以使用&
运算符强制计算两个表达式。如果你使用这个,那么每个表达式的操作符的哪一侧都无关紧要。
答案 3 :(得分:0)
是的,这很重要。在某些情况下,只评估第一个操作数(/)。文档称之为“短路”。
条件运算符
&&
和||
运算符对两个布尔表达式执行条件AND和条件OR运算。这些运算符表现出“短路”行为,这意味着仅在需要时才会评估第二个操作数。
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html