为什么第一个嵌套迭代比后续迭代更快?

时间:2016-03-26 14:53:20

标签: 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++) 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的恒定比率。

0 个答案:

没有答案