有一个解释性的代码,我想问的是什么。 Sureley,下面的代码之间的差异是可以忽略的,但它描述了这一点。
哪个在内存使用和性能方面效率最高?
if( MathUtil.CalculateSin(angle) > Angles.ACUTE){
// Something is done
}
或
double angleSin = MathUtil.CalculateSin(angle);
if( angleSin > Angles.ACUTE){
// Something is done
}
答案 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)
即使我后来在代码中不需要变量,我也经常使用第一种模式。优点是调试。
if
或作为另一个调用的参数更清楚。如果您担心变量的内存使用情况,请不要这样做。相信编译器可以优化它知道以后不会使用的变量。如果您声明变量final
,则会将{em>积极优化为described in the JLS。
答案 3 :(得分:0)
引用确实需要记忆。因此,如果您不打算在其他任何地方使用angleSin
,那么您应该选择第二个选项。此外,它不会污染命名空间。这是人们将Comparator
作为匿名类而不是创建新类的一个原因。如果他们不需要在其他地方使用。