如果不运行预热阶段,则可能会优化和编译第一个循环,但不会编译第二个循环,而合并它们时,整个合并循环都会被编译。此外,使用该选项和您的代码,由于您不使用结果,因此大多数都会得到优化。server
我已经运行了下面的测试,将每个循环以及合并的循环放在它们自己的方法中,并预热JVM以确保所有内容都得到编译。
结果(JVM 选项: ):-server -XX:+PrintCompilation
- 环路 1 = 500ms
- 环路 2 = 900 ms
- 合并循环 = 1,300 ms
因此,合并的循环稍微快一些,但不是那么多。
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 3; i++) {
loop1();
loop2();
loopBoth();
}
long start = System.nanoTime();
loop1();
long end = System.nanoTime();
System.out.println((end - start) / 1000000);
start = System.nanoTime();
loop2();
end = System.nanoTime();
System.out.println((end - start) / 1000000);
start = System.nanoTime();
loopBoth();
end = System.nanoTime();
System.out.println((end - start) / 1000000);
}
public static void loop1() {
int a = 188, aMax = 0;
for (int i = 0; i < 1000000000; i++) {
int t = a ^ i;
if (t > aMax) {
aMax = t;
}
}
System.out.println(aMax);
}
public static void loop2() {
int b = 144, bMax = 0;
for (int i = 0; i < 1000000000; i++) {
int t = b ^ i;
if (t > bMax) {
bMax = t;
}
}
System.out.println(bMax);
}
public static void loopBoth() {
int a = 188, b = 144, aMax = 0, bMax = 0;
for (int i = 0; i < 1000000000; i++) {
int t = a ^ i;
if (t > aMax) {
aMax = t;
}
int u = b ^ i;
if (u > bMax) {
bMax = u;
}
}
System.out.println(aMax);
System.out.println(bMax);
}