我有一个基准:
@BenchmarkMode(Mode.Throughput)
@Fork(1)
@State(Scope.Thread)
@Warmup(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS, batchSize = 1000)
@Measurement(iterations = 40, time = 1, timeUnit = TimeUnit.SECONDS, batchSize = 1000)
public class StringConcatTest {
private int aInt;
@Setup
public void prepare() {
aInt = 100;
}
@Benchmark
public String emptyStringInt() {
return "" + aInt;
}
@Benchmark
public String valueOfInt() {
return String.valueOf(aInt);
}
}
这是结果:
Benchmark Mode Cnt Score Error Units
StringConcatTest.emptyStringInt thrpt 40 66045.741 ± 1306.280 ops/s
StringConcatTest.valueOfInt thrpt 40 43947.708 ± 1140.078 ops/s
这表明将空字符串与整数拼接比调用String.value(100)快30%。 我理解"" + 100转换为
new StringBuilder().append(100).toString()
应用了-XX:+OptimizeStringConcat
优化,使其速度更快。我不明白的是为什么valueOf
本身比连接操作更慢。
有人能解释一下发生了什么以及为什么"" + 100更快吗?OptimizeStringConcat
做了什么魔法?
"" + 100
可能更清晰地被编译器认为是一个常量... - Louis WassermanStringBuider()
构造。 - Dmitriy DumanskiyvalueOf
的内部,但它没有回答我的问题。 - Dmitriy Dumanskiy