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

问题描述 投票:0回答:2

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

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

输出-

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

输出-

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

输出-

时差:16秒

根据我的理解,它的发生是由于每次创建Long Object时,我不确定这是如何发生的。尝试查看字节码并没有太大帮助。帮助我了解内部到底是怎么回事?

提前感谢!

java loops long-integer autoboxing
2个回答
0
投票

我自己不太有经验,但是我认为这是因为原始数据类型比对象有效得多。在内部,与long对象相关联的方法和功能要比long基本类型多得多,并且在创建Long对象时,由于要做的事情还更多,因此创建机器所需的时间也更长。希望这会有所帮助!


0
投票

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

因此,将它们应用于Long时,必须先对操作员进行拆箱,然后才对操作员进行评估,然后必须进行装箱以存储结果。

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

© www.soinside.com 2019 - 2024. All rights reserved.