【问题标题】:Java optimization : local variable or function callJava优化:局部变量或函数调用
【发布时间】:2012-10-03 09:26:04
【问题描述】:
你会怎么做?
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) ;
最重要的是,我想知道何时将值存储在局部变量中更有效,何时进行函数调用更好。
【问题讨论】:
标签:
java
variables
optimization
【解决方案1】:
更具可读性更有效。临时表达式和局部变量需要相同的空间,从 CPU/JVM 的角度来看,它并没有太大区别。 JVM 会更好地优化/插入它。
但是,如果getInstructions() 方法调用很昂贵,缓存它在局部变量中。如果它只是一个普通的吸气剂,无论如何它都会被内联。此外,恕我直言,在您的特定情况下,局部变量 更具可读性,如果 getInstructions() 随着时间的推移可能会产生不同的结果,甚至可能更正确。
【解决方案2】:
这完全取决于getInstructions() 的作用。如果它只是返回一个字段的值 - 并且如果您确信该字段值在调用之间不会改变 - 那么您可能不会看到两个 sn-ps 之间的任何效率差异.
另一方面,如果getInstructions() 需要发出十几个网络请求,那么显然您希望避免多次调用。
不过,可读性比效率更重要。在这种情况下,我发现第二个选项更具可读性 - 更清楚的是,您希望采用相同的值执行三个单独的步骤(两个方法调用和一个循环)。另一方面,我很高兴能写出这样的东西:
for (int i = 0; i < text.length(); i++) {
...
}
而不是将 分解成一个单独的变量:
int length;
for (int i = 0; i < length; i++) {
...
}
这真的取决于上下文。从可读性的角度来看,有时额外的变量会有所帮助,有时则不会。 效率 视角完全取决于方法调用在做什么,以及它对于 JIT 是否“可内联”。
【解决方案3】:
我的答案将取决于我正在尝试开发的应用程序类型。例如,
first 代码块如果值在应用过程中快速变化会更好。如果您需要准确的结果,这很好。
如果您确定最初获取的值不会影响代码的其他部分,则 第二个 是很好的。
【解决方案4】:
当你想多次使用方法的结果时,最好将方法调用的结果存储在某个临时变量中。这样可以节省方法调用的处理时间。这不会影响太多case.. 但是当调用很多时可能会影响..
另外,请记住,您的局部变量存储在stack。因此,拥有一个临时局部变量会占用堆栈空间。虽然在像这样的小情况下这不是什么大问题..但是应该避免不必要的局部变量..
所以,这两种方法都有优点和缺点。
【解决方案5】:
我相信这取决于情况。如果它需要多次调用相同的方法(并且您得到相同的值),最好进行一次调用并将其存储到某个局部变量中。
如果您只需要调用该函数一次。无需寻找局部变量。