性能变量-java

性能变量-java,java,performance,variables,Java,Performance,Variables,所以我有一个应用程序,它做了大量的数学运算,因此有大量的临时变量。我想知道的是:当我在循环之前声明变量,然后在代码1中重用它时,性能有什么不同吗?还是在循环代码2中声明它更好?该变量仅在循环内部需要,n最多可以达到数万。还是将它们作为全局变量更好?循环也被多次调用 代码1: double temp; for (int i = 0; i < n; i++) { temp = ...; } 代码2: for (int i = 0; i < n; i++) { double t

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

代码1:

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

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

谢谢你的提示。

不,性能没有差别。既不计算也不记忆。该声明未在运行时执行

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

// 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的范围,也就是说,它对名称空间的干扰最小。

通常最好是在循环内部。这样,对象引用就可以更早地进行垃圾收集,这样代码的内存效率就会更高。在声明基元变量的方法离开堆栈时,基元变量将被释放,但最好在尽可能有限的范围内声明它们

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

参考资料


很难说两者之间是否存在性能差异,您可以对其进行测量,但我想您不会发现很大的差异实际上取决于您的操作和编译器


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

第一部分代码1似乎是合乎逻辑的,永远不要在代码中使用全局变量,因为它们可能会导致许多不必要的结果。您的基准测试显示了什么?现代JVM将自动检测一段代码何时被多次调用,并将执行深入的测试优化和编译以提高运行代码块时的性能。所以,你不应该为这件事操心太多,让JVM替你做这件事。Downvoter,你想评论一下吗?有人对Downvoter发疯了,没有明显的原因。回答得好,+1。我没有投反对票,但这些都是基本变量,至少在示例中是这样,所以它们不会被垃圾收集。@AndyTurner虽然这是事实,但在尽可能小的范围内声明变量仍然是合理的做法。@AndyTurner-好的一点,我要澄清一下。只是一个小小的补充:一旦这个循环被编译成机器代码,它将被彻底消除。因此,即使字节码不相同,任何建立相对速度的微基准的天真方法都会失败。是的。对这类事情进行微观基准测试将产生完全无用的结果。