为什么执行以下代码片段所需的时间相差很大?

Ash*_*rma 4 java autoboxing loops long-integer

考虑下面的代码片段以及执行​​它们所需的时间 -

 public static void main(String[] args) {
    Long startTime = System.currentTimeMillis();
    long sum = 0L;
    for(int i = 0; i< Integer.MAX_VALUE; i++){
        sum+=i;
    }
    Long timeDiff = (System.currentTimeMillis() - startTime) / 1000;
    System.out.println("Time Difference : " + timeDiff + "secs");
}
Run Code Online (Sandbox Code Playgroud)

输出 -

时差:0秒

public static void main(String[] args) {
    Long startTime = System.currentTimeMillis();
    Long sum = 0L;
    for(int i = 0; i< Integer.MAX_VALUE; i++){
        sum+=i;
    }
    Long timeDiff = (System.currentTimeMillis() - startTime) / 1000;
    System.out.println("Time Difference : " + timeDiff + "secs");
}
Run Code Online (Sandbox Code Playgroud)

输出 -

时差:8秒

public static void main(String[] args) {
    Long startTime = System.currentTimeMillis();
    Long sum = 0L;
    for(Long i = 0L; i< Integer.MAX_VALUE; i++){
        sum+=i;
    }
    Long timeDiff = (System.currentTimeMillis() - startTime) / 1000;
    System.out.println("Time Difference : " + timeDiff + "secs");
}
Run Code Online (Sandbox Code Playgroud)

输出 -

时差:16秒

根据我的理解,这是因为每次创建长对象的对象时都会发生这种情况,我不确定这是如何发生的。尝试研究字节码并没有多大帮助。帮助我了解事情的内部到底是如何发生的?

提前致谢!

Era*_*ran 5

“++”和“+=”运算符仅针对基元定义。

因此,当您将它们应用于 a 时Long,必须在计算运算符之前进行拆箱,然后必须进行装箱来存储结果。

装箱可能比拆箱花费更多,因为拆箱只需要方法调用,而装箱需要对象实例化。

每个装箱都涉及创建一个Long实例。您的循环有Integer.MAX_VALUE迭代,因此第二个循环创建超过 20 亿个Long对象(每个sum+=i操作一个),而第三个循环创建超过 40 亿个Long对象(每个i++操作一个,每个sum+=i操作一个)。这些对象必须被实例化并随后被垃圾收集。这需要时间。