Java中奇怪的代码计时行为

时间:2012-07-09 07:57:23

标签: java

在以下代码中:

long startingTime = System.nanoTime();
int max = (int) Math.pow(2, 19);
for(int i = 0; i < max; ){
    i++;
}
long timePass = System.nanoTime() - startingTime;
System.out.println("Time pass " + timePass / 1000000F);

我正在尝试计算在我的机器上执行简单操作所需的时间。

所有高达19的幂的计算都会增加运行此代码所需的时间,但是当我超过19(达到max int值31)时,我惊讶地发现它对它的时间没有影响需要。 它总是在我的机器上显示5毫秒!!!

这怎么可能?

3 个答案:

答案 0 :(得分:12)

您刚刚目睹了HotSpot将您的整个循环优化为遗忘。这是智能。你需要在循环中做一些真正的动作。我建议引入int累加器var并对其执行一些按位操作,最后打印结果以确保在循环后需要它。

答案 1 :(得分:2)

在HotSpot JVM上,默认为-XX:CompileThreshold=10000。这意味着迭代10K次的循环可以触发整个方法的优化。在您的情况下,您需要计算检测和编译(在后台)您的方法所需的时间。

答案 2 :(得分:0)

在循环中使用另一个System.nanoTime()。没有人可以优化这一点。

for(int i = 0; i < max; ){
i++;
dummy+=System.nanoTime();
}

不要忘记这样做:

System.out.println(dummy);
循环后

。确保非优化

相关问题