У меня есть ориентир:Почему конкатенация строк быстрее, чем String.valueOf для преобразования целого в строку?
@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
Это показывает, что конкатенации пустой строки с целым числом в 30% быстрее, чем вызов String.value (100). Я понимаю, что «» + 100 преобразуется в
new StringBuilder().append(100).toString()
и -XX:+OptimizeStringConcat
оптимизации применяется, что делает это быстро. Я не понимаю, почему valueOf
сам медленнее, чем конкатенация. Может кто-нибудь объяснить, что именно происходит, и почему «+ 100 быстрее. Какую магию делает OptimizeStringConcat
?
'' "+ 100', вероятно, гораздо яснее, чтобы компилятор мог распознавать константу ... –
Вы можете посмотреть исходный код' valueOf'. Я уверен, что он пытается обнаружить типы объектов, что означает автоматическое определение вашего примитива int и такого –
. Один из них - вызов метода. Другой, компилятор может скомпилировать, однако он хочет. –