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) ;

最重要的是,我想知道何时将值存储在局部变量中更有效,何时进行函数调用更好。

4

5 回答 5

21

更具可读性更有效。临时表达式和局部变量需要相同的空间,从 CPU/JVM 的角度来看,它并没有太大区别。JVM 会更好地优化/插入它。

但是,如果getInstructions()方法调用很昂贵,请将其缓存在局部变量中。如果它只是一个普通的吸气剂,无论如何它都会被内联。此外,恕我直言,在您的特定情况下,局部变量更具可读性,如果getInstructions()随着时间的推移可能会产生不同的结果,甚至可能更正确。

于 2012-10-03T09:27:12.477 回答
10

这完全取决于做什么getInstructions()。如果它只是返回一个字段的值——并且如果你确信字段值在调用之间不会改变——那么你可能不会看到两个片段之间的任何效率差异。

另一方面,如果getInstructions()需要发出十几个 Web 请求,那么显然您希望避免多次调用该请求。

不过,可读性比效率更重要。在这种情况下,无论如何我发现第二个选项更具可读性 - 更清楚的是,您希望使用相同的值执行三个单独的步骤(两个方法调用和一个循环)。另一方面,我很高兴能写出类似的东西:

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

而不是将分解为一个单独的变量:

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

这真的取决于上下文。从可读性的角度来看,有时额外的变量会有所帮助,有时则不会。效率的观点完全取决于方法调用在做什么,以及它对于 JIT 是否“可内联”。

于 2012-10-03T09:28:42.253 回答
0

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

另外,请记住,您的局部变量存储在stack. 因此,拥有一个临时局部变量会占用堆栈空间。虽然在像这样的小情况下这并不是什么大问题。但是应该避免不必要的局部变量。

所以,这两种方法各有利弊。。

于 2012-10-03T09:27:16.937 回答
0

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

如果值在应用期间快速变化,则第一个代码块会更好如果您需要准确的结果,这很好。

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

于 2012-10-03T09:32:23.177 回答
0

我相信这取决于情况。如果它需要多次调用相同的方法(并且您得到相同的值)并且最好进行一次调用并将其存储到某个局部变量中。

如果您只需要调用该函数一次。无需寻找局部变量。

于 2012-10-03T09:35:41.087 回答