내가 벤치 마크가 :Integer를 String으로 변환하기 위해 String.valueOf보다 문자열 연결이 왜 빠릅니까?
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 % 빠르다는 것을 보여줍니다 여기
@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);
}
}
을 그리고 것은 결과입니다. 나는 ""+ 100
new StringBuilder().append(100).toString()
로 변환하고 빠르게 만드는 -XX:+OptimizeStringConcat
최적화를 적용 것으로 알고 있습니다. 내가 이해하지 못하는 이유는 valueOf
자체가 연결보다 느린 이유입니다. 누군가 정확히 무슨 일이 일어나고 있는지, 그리고 왜 "+100"이 빠를 지 설명 할 수 있습니까? OptimizeStringConcat
의 마술은 무엇입니까?
"" "+ 100'은 컴파일러가 상수로 인식하는 데있어 아마도 더 명확합니다. –
'valueOf'의 소스 코드를 살펴볼 수 있습니다. 나는 꽤 그것이 객체 타입을 탐지하려고 시도한다는 것을 확신한다. 이것은 당신의 int 프리미티브를 autoboxing하는 것을 의미한다. –
하나는 메소드 호출이다. 다른 하나는 컴파일러가 원하는대로 컴파일 할 수 있습니다. –