gpt4 book ai didi

java - 对象、堆或堆栈中的原语?

转载 作者:行者123 更新时间:2023-11-30 11:15:08 24 4
gpt4 key购买 nike

大多数人都说primitive in object是存储在Heap中的,然而,我从下面的性能测试中得到了不同的结果:

public class Performance {

long sum = 0;

public static void main(String[] args) {
// TODO Auto-generated method stub
long startTime = System.currentTimeMillis();
long pSum = 0;
for(int i = 0; i < Integer.MAX_VALUE; i++){
pSum += i;

}
long endTime = System.currentTimeMillis();
System.out.println("time of using primitive:" + Long.toString(endTime - startTime));
System.out.println(pSum);

long startTime1 = System.currentTimeMillis();
Long Sum = 0L;
for(int i = 0; i < Integer.MAX_VALUE; i++){
Sum += i;
}
long endTime1 = System.currentTimeMillis();
System.out.println("time of using object:" + Long.toString(endTime1 - startTime1));
System.out.println(Sum);

Performance p = new Performance();
long startTime2 = System.currentTimeMillis();
for(int i = 0; i < Integer.MAX_VALUE; i++){
p.sum += i;
}
long endTime2 = System.currentTimeMillis();
System.out.println("time of using primitive in object:" + Long.toString(endTime2 - startTime2));
System.out.println(p.sum);
}

结果是这样的:

time of using primitive:1454
2305843005992468481
time of using object:23870
2305843005992468481
time of using primitive in object:1529
2305843005992468481

我们可以发现使用primitive和在object中使用primitive的时间几乎是一样的。所以我很困惑对象中的基元是否存储在堆中。为什么使用原语和在对象中使用原语的时间成本几乎相同?

最佳答案

你去的时候

Long sum;
...
sum += 1;

理论上,JVM 每次都会分配一个新的 Long,因为 Long 是不可变的。现在,一个真正聪明的编译器可以在这里做一些聪明的事情,但这解释了为什么你的第二个循环的时间要长得多。它正在分配 Integer.MAXINT 新的 Sum 对象。 Autoboxing 棘手的另一个原因。

另外两个循环不需要分配新对象。一个使用原始 int,而在另一个中,您可以递增 Performance.sum 而无需每次都分配新的 Performance。如图所示,访问堆栈或堆中的原始 int 应该大致同样快。

您的时间安排与堆与堆栈的访问速度关系不大,但与在循环中分配大量对象有关。

正如其他人所指出的,微观基准可能会产生误导。

关于java - 对象、堆或堆栈中的原语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25597814/

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