If语句中的可执行语句

时间:2015-05-27 12:58:20

标签: java

有一个解释性的代码,我想问的是什么。 Sureley,下面的代码之间的差异是可以忽略的,但它描述了这一点。

哪个在内存使用和性能方面效率最高?

if( MathUtil.CalculateSin(angle) > Angles.ACUTE){
     // Something is done
    }

double angleSin = MathUtil.CalculateSin(angle);

if( angleSin > Angles.ACUTE){
// Something is done
}

4 个答案:

答案 0 :(得分:7)

这取决于你是否要重复使用变量。

  • 如果是,请使用第二种情况。
  • 如果没有使用第一种情况。

如果您不打算重复使用它,则没有理由将值存储在变量中。

修改:

根据你的评论,似乎你主要是要求这个问题来解决性能问题......

  

其实我的问题不是算法,也不是我的方式   实现它。我很好奇这些方法的内存使用情况,   因此,效率是目的。

不要指望这两种方法在内存使用方面有任何差异,JVM和JIT会尽可能地优化它,以便两种情况都变得相同。

答案 1 :(得分:3)

要扩展其他答案,您还应考虑代码的可读性。在这种情况下,if的含义非常明显。但是,如果您的条件更复杂,那么预先计算该条件,给变量一个有意义的名称,然后在if - 语句中使用该变量是个好主意。

在您的情况下,它还取决于MathUtil.CalculateSin(angle) > Angles.ACUTE - 语句的上下文。同样,final boolean angleIsAcute = (MathUtil.CalculateSin(angle) > Angles.ACUTE); if(angleIsAcute) { ... } 很容易一目了然。但是,

GROUP BY

会带来更好的意义。当然,在这种情况下,两种可能性都非常相似,但我希望你能看到我的目标。

不要担心存储额外变量所带来的开销。即使java编译器没有优化你的代码,任何值得盐的JVM都会优化字节码,性能开销可以忽略不计。

答案 2 :(得分:1)

即使我后来在代码中不需要变量,我也经常使用第一种模式。优点是调试。

  1. 您可以在调试器中单步执行代码时检查和更改变量的值。
  2. 如果在语句右侧的调用中发生异常,则有时会比将调用嵌入if或作为另一个调用的参数更清楚。
  3. 如果您担心变量的内存使用情况,请不要这样做。相信编译器可以优化它知道以后不会使用的变量。如果您声明变量final,则会将{em>积极优化为described in the JLS

答案 3 :(得分:0)

引用确实需要记忆。因此,如果您不打算在其他任何地方使用angleSin,那么您应该选择第二个选项。此外,它不会污染命名空间。这是人们将Comparator作为匿名类而不是创建新类的一个原因。如果他们不需要在其他地方使用。