我有以下程序。当我注意到一些不寻常的事情时,我只是在摆弄其他东西。 “y = 3;”行似乎对前一个代码块的运行速度有影响。当该行被注释掉时,代码前半部分的运行速度比后半部分慢大约十倍。然而,当该线路未注释时,两个半部以相同的速度运行。有趣的是,有问题的行不应该执行任何操作,因为此时 y 的值已经是 3。
编辑: 我在“y=3”上方添加了“System.out.println(y)”行,它打印了 3。这就是为什么我认为它是 3。我是根据程序的输出进行测量的。它打印的两行是两个运行时间,底部的计时器代码清楚地显示了我如何测量时间。
/**
* @author lpreams
*/
public class Misc {
public static void main(String[] args) {
new Misc().run();
}
public void run() {
Timer t = new Timer();
t.start();
int y = Integer.MIN_VALUE;
for (int j = 0; j < Integer.MAX_VALUE; ++j) {
for (int i = 0; i < Integer.MAX_VALUE; ++i) {
++y;
}
}
t.stop();
System.out.println(t.getElapsedTime());
t.reset();
//y = 3;
t.start();
for (int j = 0; j < Integer.MAX_VALUE; ++j) {
for (int i = 0; i < Integer.MAX_VALUE; ++i) {
++y;
}
}
t.stop();
System.out.println(t.getElapsedTime());
}
private static class Timer {
private long startTime = 0;
private long stopTime = 0;
private long elapsed = 0;
public void start() {
this.startTime = System.nanoTime()/1000000;
}
public void stop() {
this.stopTime = System.nanoTime()/1000000;
elapsed += stopTime - startTime;
}
public long getElapsedTime() {
return elapsed;
}
public void reset() {
elapsed = 0;
}
}
}
我在 OS X 10.9.2 上的 Eclipse 中运行此代码。我正在运行最新版本的java。我的机器是 MacBook Pro,配备 2.4GHz Core 2 Duo 和 8GB RAM。
最佳答案
您从这个微基准测试中获得的任何结果都是值得怀疑的。您没有考虑 JVM 预热效果。
话虽如此,如果我们可以假设效果是真实的,我会将其归因于 JIT 优化器无法检测到第一个循环体可以被优化掉......当y = 3
赋值就在那里。您遇到的情况是,增加一点“复杂性”会抑制优化。它发生了。
(分配的值并不重要。这与 JIT 编译器的代码生成有关......这发生在您预测的 y
值之前 be 3
可以通过任何东西计算。它可以影响 JIT 编译器的行为。)
关于java - 稍后在代码中重置变量会使较早的代码块运行速度变慢。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23255783/