Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么第一个嵌套迭代比后续的要快?_Java_Performance - Fatal编程技术网

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