Java 优化:局部变量或函数调用

10

你会选择哪个?

 doThings(folder.getInstructions()) ;
 for (Instruction instruction : folder.getInstructions()) {
    // do things
 }
functionCall(folder.getInstructions()) ;

或者这样:

instructions = folder.getInstructions() ;
doThings(instructions)
for (Instruction instruction : instructions) {
  // do things
}
functionCall(instructions) ;

最重要的是,我想知道何时将一个值存储在本地变量中更有效,何时调用函数更好。

5个回答

21

易读性更高就更有效率。临时表达式和本地变量需要同样的空间,在 CPU/JVM 视角下,两者并没有太大区别。JVM 在优化/内联方面会做得更好。

但是,如果 getInstructions() 方法调用很耗费资源,则在本地变量中缓存它。如果只是一个普通的 getter,那么它肯定会被内联。此外,我认为在您的特定情况下,使用本地变量更易读,甚至如果 getInstructions() 可能随时间而有不同结果,这种方式也可能更正确。


10

这完全取决于getInstructions()函数的具体作用。如果它只是返回一个字段的值 - 并且你相信该字段的值不会在调用之间发生改变 - 那么你可能不会看到两个代码片段之间的效率差异。

另一方面,如果getInstructions()需要进行数十次网页请求,那么显然你要避免多次调用该函数。

可读性比效率更重要。在这种情况下,我认为第二个选项更易读 - 它更清晰表达了你想要使用相同值执行三个单独的步骤(两个方法调用和一个循环)。另一方面,我也可以写出这样的代码:

for (int i = 0; i < text.length(); i++) {
    ...
}

与其将 那个 分解为一个单独的变量,不如保留在原处:

int length;
for (int i = 0; i < length; i++) {
    ...
}

这真的取决于上下文。从可读性的角度来看,有时候额外的变量会有所帮助,而有时则不然。而从效率的角度来看,则完全取决于该方法调用正在执行什么操作,以及它是否适合于JIT内联。


0

每当您想要多次使用方法的结果时,最好将方法调用结果存储在某个临时变量中。这样可以节省方法调用的处理时间。在这种情况下影响不大,但是在存在许多调用时可能会有影响。

此外,请记住,本地变量存储在堆栈上。因此,拥有一个临时本地变量会占用堆栈空间。虽然在像这种小情况下这并不是很重要。但是应避免不必要的本地变量。

因此,这两种方法都有优点和缺点。


0

我的答案将取决于我正在开发的应用程序的类型。例如,

如果在应用程序中值经常变化,则第一个代码块更好。这对于需要准确结果的情况非常有用。

如果您确定最初获取的值不会影响代码的其他部分,则第二个代码块很好。


0

我认为这取决于情况。如果需要多次进行相同方法调用(且你得到的是相同的值),最好只调用一次并将其存储在某个本地变量中。

如果只需要调用函数一次,则不需要使用本地变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接