Mam benchmark:
@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);
}
}
A oto wynik:
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
Pokazuje, że łączenie pustego łańcucha z liczbą całkowitą jest o 30% szybsze niż wywołanie String.value (100). Rozumiem, że "" + 100 konwersji na
new StringBuilder().append(100).toString()
i -XX:+OptimizeStringConcat
Zastosowano optymalizację, która sprawia, że jest szybka. Czego nie rozumiem, to dlaczego valueOf
sama jest wolniejsza niż konkatenacja.
Czy ktoś może wyjaśnić, co dokładnie się dzieje i dlaczego "" + 100 jest szybsze. Jaka magia OptimizeStringConcat
robić?