gpt4 book ai didi

java - Java中的自动装箱与手动装箱

转载 作者:IT老高 更新时间:2023-10-28 20:48:48 25 4
gpt4 key购买 nike

为什么第二段代码更快?

Map<Integer, Double> map = new HashMap<Integer, Double>();
for (int i = 0; i < 50000; i++) {
for (double j = 0.0; j < 10000; j++) {
map.put(i, j);
}
}

Map<Integer, Double> map=new HashMap<Integer, Double>();
for (int i = 0; i < 50000; i++) {
for (double j = 0.0; j < 10000; j++) {
map.put(new Integer(i), new Double(j));
}
}

最佳答案

Autoboxing 使用 Integer.valueOf,它在内部缓存小整数的 Integer 对象(默认为 -128 到 127,但最大值可以使用“java.lang.Integer.IntegerCache. high"属性 - 参见 Integer.valueOf) 的源代码,因此与直接调用 new Integer 不同。因为 Integer.valueOf 在调用 new Integer 之前会快速检查整数值的大小,所以调用 new Integer 会快一点直接(尽管如果您有很多小整数,它会使用更多内存)。 Java中的分配速度非常快,而且GC的时间与存活的短生命周期对象的数量成正比(即与垃圾的数量不成正比),所以GC也非常快。

但是根据 JVM 版本和启用的优化,存在标量替换优化,在分配短期对象时会产生更大的性能差异(在您的示例中,无法进行优化,因为您将对象存储在 map 中,但在许多其他情况下它很有用)。

在最近的 JVM 版本中有 scalar replacement优化(除了在 1.6.0_18 中逃逸分析为 temporarily disabled ),这意味着可以优化短期对象的分配。当 JVM 中的标量替换是新的时,有人做了 a benchmark那里有与您类似的代码。结果是使用原语的代码最快,显式 new Integer() 调用的代码几乎与使用原语的代码一样快,而使用自动装箱的代码要慢得多。这是因为自动装箱使用 Integer.valueOf 并且至少当时标量替换优化没有考虑到这种特殊情况。不知道从那以后优化有没有改进。

关于java - Java中的自动装箱与手动装箱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2307904/

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