Java 在双(或多)循环内部或外部声明/初始化变量
根据一个和多个Google搜索,在循环外部或内部声明或初始化变量“可能”在性能方面是相同的 我正在运行一个计算机模拟,我正在尝试尽可能地优化代码,因为它必须运行很多次,并且它有多个内部循环和大量迭代 我想知道是否值得将所有变量移出循环。我有很多“理论上”不断被重新声明的变量。我说“理论上”是因为我不知道Java编译器是否真的优化了代码,并在方法级别声明了所有内容 基本上,什么更有效率?代码A还是代码B 代码A:Java 在双(或多)循环内部或外部声明/初始化变量,java,optimization,performance-testing,nested-loops,micro-optimization,Java,Optimization,Performance Testing,Nested Loops,Micro Optimization,根据一个和多个Google搜索,在循环外部或内部声明或初始化变量“可能”在性能方面是相同的 我正在运行一个计算机模拟,我正在尝试尽可能地优化代码,因为它必须运行很多次,并且它有多个内部循环和大量迭代 我想知道是否值得将所有变量移出循环。我有很多“理论上”不断被重新声明的变量。我说“理论上”是因为我不知道Java编译器是否真的优化了代码,并在方法级别声明了所有内容 基本上,什么更有效率?代码A还是代码B 代码A: private void codeA() { double a = 0.0;
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
}
}
private void codeA(){
双a=0.0;
for(inti1=0;i
代码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
}
}
private void codeA(){
双a;
for(inti1=0;i
代码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
}
}
private void编解码器(){
for(inti1=0;i
我只是在这个例子中使用变量a,但是计算机模拟使用了更多。我的大多数变量都是原语(int、double、float)。为了提高性能,在循环之外声明原语有意义吗
javac
将不会优化。所有3种情况下生成的字节码。(javac Test.java
编译并javap-c Test.class
显示字节码)
Java虚拟机可以进行优化
基准测试显示了明确的赢家:
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
单位为每秒操作数,越多越好。使用OpenJDK IcedTea 2.5.4 Java虚拟机
因此,在外部声明和初始化变量应该是最有效的。代码已经准备好了,为什么不检查运行时,比如每个函数的1000000次调用呢。如果差异很大,你会注意到的,不是吗?别忘了读一读:如果在那个例子中有什么需要改进的地方,那么HotSpot()可能比你做得更好。您应该尝试编写清晰的代码,这意味着尽可能减少变量的范围。(重新发布以修复链接)@toto_tico只有一种方法:测量。但说实话,如果真的有什么不同,我会非常惊讶。@toto_tico,对了,很抱歉。我认为这样的问题可能会以“询问工具/库”或“基于主要观点”来结束。但是,与此同时,我正在本地建立JMH来测试您的东西,所以我可能会在一段时间内为您提供一个答案。(不过我花了5分钟以上的时间:))