根据similar question ,以及多次 Google 搜索,在循环外部或内部声明或初始化变量“可能”在性能方面是相同的。
我正在运行计算机模拟,并且我正在尝试尽可能优化代码,因为它必须运行很多次,并且有多个内部循环和大量迭代。
我想知道是否值得将所有变量移到循环之外。我有许多“理论上”不断重新声明的变量。我说“理论上”是因为我不知道 Java 编译器是否真的优化了代码并在方法级别声明了所有内容。
基本上,什么会更有效率?代码A还是代码B?
代码A:
private void codeA() {
double a = 0.0;
for (int i1 = 0; i < i1_N; i1++ ) {
// Many other loops
for (int im = 0; i < im_N; im++ ) {
a = 0; // a is used for the first time
for (int in = 0; i < in_N; in++ ) {
a++; // calculate something with a
}
}
// close many other loops
}
}
代码B:
private void codeA() {
double a;
for (int i1 = 0; i < i1_N; i1++ ) {
// Many other loops
for (int im = 0; i < im_N; im++ ) {
a = 0; // a is used for the first time
for (int in = 0; i < in_N; in++ ) {
a++; // calculate something with a
}
}
// close many other loops
}
}
代码C:
private void codeC() {
for (int i1 = 0; i < i1_N; i1++ ) {
// Many other loops
for (int im = 0; i < im_N; im++ ) {
double a = 0; // a is used for the first time
for (int in = 0; i < in_N; in++ ) {
a++; // calculate something with a
}
}
// close many other loops
}
}
在这个例子中我只使用了变量a,但是计算机模拟使用了更多。我的大多数变量都是基元(int、double、float)。为了提高性能而在循环外部声明原语是否有意义?
最佳答案
javac
不会优化。在所有 3 种情况下生成的字节码 is different 。 (javac Test.java
编译并 javap -c Test.class
显示字节码)
Java 虚拟机可能会优化。
JMH基准显示明显的赢家:
Benchmark Mode Cnt Score Error Units
MyBenchmark.testA thrpt 20 423.437 ± 6.745 ops/s
MyBenchmark.testB thrpt 20 337.728 ± 56.363 ops/s
MyBenchmark.testC thrpt 20 351.419 ± 70.290 ops/s
单位是每秒的操作数,越多越好。 Benchmark source code 。使用OpenJDK IcedTea 2.5.4 Java虚拟机。
因此,在外部声明和初始化变量应该是最有效的。
关于java - 在双(或多)循环内部或外部声明/初始化变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31058658/