执行以下代码片段所花费的时间差异很大的原因是什么?

Reason why the time taken to execute below code snippets differ a lot?

考虑下面的代码片段和执行它们所花费的时间 -

 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");
}

输出 -

Time Difference : 0secs

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");
}

输出 -

Time Difference : 8secs

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");
}

输出 -

Time Difference : 16secs

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

提前致谢!

“++”和“+=”运算符仅为原语定义。

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

装箱可能比拆箱成本更高,因为拆箱只需要调用一个方法,而装箱需要对象实例化。

每个拳击都涉及创建一个 Long 实例。您的循环有 Integer.MAX_VALUE 次迭代,因此第二个循环创建了超过 20 亿个 Long 对象(每个 sum+=i 操作一个),而第三个循环创建了超过 40 亿个 Long 对象(每个 i++ 操作一个,每个 sum+=i 操作一个)。这些对象必须被实例化,然后进行垃圾回收。那要花时间。

可能的原因:
- 对象创建过多有时会导致 GC activity
- 包装器的装箱和拆箱太多,反之亦然。