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

Lyt*_*yth 10 java variables optimization

你会做什么?

 doThings(folder.getInstructions()) ;
 for (Instruction instruction : folder.getInstructions()) {
    // do things
 }
functionCall(folder.getInstructions()) ;
Run Code Online (Sandbox Code Playgroud)

或这个 :

instructions = folder.getInstructions() ;
doThings(instructions)
for (Instruction instruction : instructions) {
  // do things
}
functionCall(instructions) ;
Run Code Online (Sandbox Code Playgroud)

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

Tom*_*icz 21

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

但是,如果getInstructions()方法调用很昂贵,请将其缓存在局部变量中.如果它只是一个简单的吸气剂,它无论如何都会被内联.此外恕我直言,你的具体情况局部变量更具可读性,甚至更正确的,如果getInstructions()可能有一段时间不同的结果.


Jon*_*eet 10

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

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

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

for (int i = 0; i < text.length(); i++) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

int length;
for (int i = 0; i < length; i++) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

这取决于具体情况.有时,从可读性的角度来看,额外的变量有助于(有时不会).在效率角度来看是完全取决于什么方法调用是干什么的,无论是在JIT"可以内联".