3

在以下代码中:

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(最大 int 值 31)时,我惊讶地发现它对所需时间没有影响。它总是在我的机器上显示 5 毫秒!!!

怎么会这样?

4

3 回答 3

12

您刚刚见证了 HotSpot 优化您的整个循环以被遗忘。这很聪明。您需要在循环内执行一些实际操作。我建议引入一个int累加器 var 并对它进行一些按位运算,最后打印结果以确保在循环之后需要它。

于 2012-07-09T07:59:43.773 回答
2

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

于 2012-07-09T08:31:37.233 回答
0

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

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

不要忘记做:

System.out.println(dummy);

循环之后。确保非优化

于 2012-07-09T08:47:49.427 回答