gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:47:52 24 4
gpt4 key购买 nike

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

 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 操作一个)。这些对象必须被实例化,然后进行垃圾回收。这需要时间。

关于java - 执行以下代码片段所花费的时间差异很大的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60733751/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com