我正在查看这个类似的帖子,其顶部回答说
然而,根据我的基准测试,
+
和StringBuilder.append()
之间"没有任何性能差异",因为前者将被JVM转化为后者。然而,根据我的基准测试,
+
方法始终比StringBuilder
方法快约20%(我使用的是Java17,运行在Intel core i7上): @State(Scope.Thread)
public static class BenchState {
private String a = "A";
private String b = "B";
private String c = "C";
}
@Benchmark
public void bmStringConcat(final BenchState state, final Blackhole blackhole) {
String a = state.a;
String b = state.b;
String c = state.c;
final String s = "{a:" + a + ", b:" + b + ", c: " + c + "}";
blackhole.consume(s);
}
@Benchmark
public void bmStringBuilder(final BenchState state, final Blackhole blackhole) {
String a = state.a;
String b = state.b;
String c = state.c;
StringBuilder sb = new StringBuilder();
final String s = sb.append("{a:").append(a)
.append(", b:").append(b)
.append(", c:").append(c)
.append("}")
.toString();
blackhole.consume(s);
}
是因为如此处所述,"+"版本被转换为invokedynamic
调用吗?
还是有其他原因?
invokedynamic
的性能更好,因为这是引入它的目的之一。请确保不要使用Eclipse编译器来比较这些变体,因为它还不支持invokedynamic
。或者,使用javap
验证编译后的代码。 - Holger