【问题标题】: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】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-10-17
              相关资源
              最近更新 更多