gpt4 book ai didi

java - JAVA足够智能来优化vararg数组吗?

转载 作者:行者123 更新时间:2023-11-30 06:47:11 26 4
gpt4 key购买 nike

鉴于我们有这样的方法,并且我们希望尽可能快且内存高效。 JVM 是否会足够聪明,将其优化为简单的字符串生成器附加,并避免为可变参数创建 Object[] 并避免将原语自动装箱到该对象数组的 Object 中?

protected String stringId(Object... things) {
final StringBuilder sb = new StringBuilder();

for (Object thing : things) {
if(sb.length() > 0) {
sb.append('-');
}
sb.append(String.valueOf(thing));
}

return sb.toString();
}

最佳答案

保存变量参数的临时数组是在调用站点创建的,每个调用站点将单独优化,并且可能会删除或不删除对象分配。这需要将您的方法内联到调用者,以允许优化器证明该数组纯粹是临时的,即不会转义。

但是,无论这种情况发生与否,都无关紧要。在未优化的执行场景中,您的基本足迹至少包含五个对象实例、可变参数数组、StringBuilder 及其支持数组以及结果 String 及其结果支持阵列。然后,对于每个还不是 String 或特殊处理值(如 nullboolean)的参数,调用 String .valueOf(thing) 可能会在附加到 StringBuilder 之前返回一个带有新支持数组的新 String 实例。

此外,StringBuilder 的后备数组以 16 个字符的默认容量开始,每次容量耗尽时都会被更大的数组替换。

如上所述,这就是未优化的执行场景,优化器会在这些操作中找到很多优化机会,这些操作比为 varargs 参数创建的唯一数组实例具有更大的影响。这也适用于需要自动装箱的值。这种自动装箱也发生在调用者处,并且受到专门针对自动装箱的优化。对于某些值,甚至必须在每次装箱时评估相同的对象。

请注意,经常被忽视的实际费用是在不同的地方。例如,将数值转换为十进制表示形式比将这些值包装成轻量级的整数要昂贵得多。 Double 对象。

关于java - JAVA足够智能来优化vararg数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46277370/

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