【发布时间】:2017-09-18 21:50:33
【问题描述】:
鉴于我们有这样的方法,并且我们希望尽可能快且内存效率高。 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();
}
【问题讨论】:
-
在底层,可变参数是一个数组;它只是语法糖。
-
可变参数是语法糖,总是创建一个新数组。由于您的参数是一个对象数组,因此将始终涉及自动装箱。
-
我不知道哪些 JVM(如果有的话)会尝试这种优化。我不认为它会,即使它会,它也可能只有在对这个方法的调用被内联时才会发生。内联取决于调用站点,并且在同一程序的运行中很容易发生变化。
-
@Mike Strobel:确实,尤其是在调用站点上也发生数组创建时。如果没有内联,就不可能在调用点得出结论该数组将纯粹是临时的。
标签: java performance jvm variadic-functions jit