Java 为什么第一个嵌套迭代比后续的要快?
测试应用:Java 为什么第一个嵌套迭代比后续的要快?,java,performance,Java,Performance,测试应用: 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++
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);
}
}
我注意到,无论何时运行程序,第一次嵌套迭代都比后续的要快得多
为什么会这样
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);
}
}
即使在第一个例子中,我也希望第一次迭代会更慢,因为预热时间(初始化、JIT优化等),正如@Mureinik善意地指出的答案中所描述的,但事实恰恰相反
编辑2
当我增加j
变量的限值时,再加上一个零(十次),差值超过10秒:
25747
38637
37767
38104
38690
----
27951
38780
39035
37962
37931
这似乎是一个约为
2.6/3.7
的恒定比率,我得到的输出与您的不同:3410354738634153324
,JVM1。8@AlexShesterov我也观察到了Oracle java 7的类似行为。您使用的jvm提供程序是什么?@Mureinik我编辑了我的问题。现在一切似乎都符合你所指问题答案中提到的规则。你仍然认为这是一个复制品?它是复制品,不是由Muryik提到的。在这种情况下,可能是静态变量在第一次迭代时缓存在寄存器中。
2587
3736
3736
3734
3732
----
2560
3737
3734
3735
3740
25747
38637
37767
38104
38690
----
27951
38780
39035
37962
37931