if-condtions的顺序是否会影响性能?

时间:2017-11-21 09:58:05

标签: java performance

'if-conditions'的顺序是否会影响性能?

假设订单很重要,此代码if (slowMethod() && fastMethod())将慢于if (fastMethod() && slowMethod())

我认为顺序很重要,因为编译器不分析条件的执行时间。但我不确定。

4 个答案:

答案 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)

&&运算符(以及||运算符)执行短路。这意味着,如果您有两个操作数AB,而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