变量性能 - java

Variables performance - java

所以我有一个应用程序可以做很多数学运算,因此有大量的临时变量。我想知道的是:当我在循环之前声明变量然后重用它(代码 1)时,是否有任何性能差异,或者在循环内声明它更好(代码 2)?该变量仅在循环内部需要,n 最多可达数万。还是将它们作为全局变量更好?循环也被调用了不止一次。

代码 1:

double temp;
for (int i = 0; i < n; i++) {
   temp = ...;
}

代码 2:

for (int i = 0; i < n; i++) {
  double temp = ...;
}

感谢提示。

不,这在性能上没有区别。 (既不是计算方面的,也不是内存方面的。)声明在运行时不是"executed"。

事实上,以下两个片段生成了完全相同的字节码:

// Snippet 1                        // Snippet 2
int i;                              int i;
double temp;                        for (i = 0; i < 5; i++) {     
for (i = 0; i < 5; i++) {               double temp = i;
    temp = i;                       }
}

// Generates                        // Generates

   0: iconst_0                       0: iconst_0
   1: istore_1                       1: istore_1
   2: iload_1                        2: iload_1
   3: iconst_5                       3: iconst_5
   4: if_icmpge     16               4: if_icmpge     16
   7: iload_1                        7: iload_1
   8: i2d                            8: i2d
   9: dstore_2                       9: dstore_2
  10: iinc          1, 1             10: iinc          1, 1
  13: goto          2                13: goto          2

那么,这应该可以回答您关于性能的问题。

现在,我仍然会选择第二种方法,因为它限制了 temp 的范围,即它使命名空间混乱最少。

通常 declare variables in the smallest scope possible(在循环内部)更好。这样,对象引用就可以更早地进行垃圾回收,因此您的代码的内存效率会更高。当声明原始变量的方法离开堆栈时,原始变量将被释放,但最好在尽可能有限的范围内声明它们。

至于速度方面的考虑,应该没有什么区别。 these answers中的字节码分析表明,最终没有区别。

参考资料

  • Declaring variables inside or outside of a loop
  • Declaring variables inside or outside of a loop
  • Which loop has better performance? Why?

很难说两者之间是否存在性能差异,您可以测量它,但我想您不会发现太大差异(真的取决于您的工作和您的编译器)

但是,我认为代码选项 2 是更好的做法,因为它仅在循环中使用,因此您不需要在循环之外对该变量进行任何更广泛的范围界定。