测试应用程序:
public class Main {
private static long a = 0;
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
long start = System.currentTimeMillis();
for (long j = 0; j < 5000000000L; j++) a++;
System.out.println(System.currentTimeMillis() - start);
}
System.out.println("\na = " + a);
}
}
输出:
2600
3739
3735
3734
3742
我注意到每当我运行程序时,第一次嵌套迭代比后续嵌套迭代快得多。
为什么会这样?
Java版:
java version "1.8.0_74"
Java(TM) SE Runtime Environment (build 1.8.0_74-b02)
Java HotSpot(TM) 64-Bit Server VM (build 25.74-b02, mixed mode)
修改
如果我将外环复制粘贴到第一个外面的正下方:
public class Main {
private static long a = 0;
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
long start = System.currentTimeMillis();
for (long j = 0; j < 5000000000L; j++) a++;
System.out.println(System.currentTimeMillis() - start);
}
System.out.println("----");
for (int i = 0; i < 5; i++) {
long start = System.currentTimeMillis();
for (long j = 0; j < 5000000000L; j++) a++;
System.out.println(System.currentTimeMillis() - start);
}
System.out.println("\na = " + a);
}
}
然后第一次迭代在两个外循环中都是最快的:
2587
3736
3736
3734
3732
----
2560
3737
3734
3735
3740
即使在第一个例子中,我也希望第一次迭代更慢,因为预热时间(初始化,JIT优化等),如question的答案中所描述的那样@Mureinik指出但是却恰恰相反。
编辑2
当我通过向其添加另一个零(十次)来增加j
变量的限制时,差异超过10秒:
25747
38637
37767
38104
38690
----
27951
38780
39035
37962
37931
它似乎是大约2.6/3.7
的恒定比率。