执行以下代码片段所花费的时间差异很大的原因是什么?
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。
- 包装器的装箱和拆箱太多,反之亦然。
考虑下面的代码片段和执行它们所花费的时间 -
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。
- 包装器的装箱和拆箱太多,反之亦然。