2017-02-12 4 views
16

내가 벤치 마크가 :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의 마술은 무엇입니까?

+1

"" "+ 100'은 컴파일러가 상수로 인식하는 데있어 아마도 더 명확합니다. –

+0

'valueOf'의 소스 코드를 살펴볼 수 있습니다. 나는 꽤 그것이 객체 타입을 탐지하려고 시도한다는 것을 확신한다. 이것은 당신의 int 프리미티브를 autoboxing하는 것을 의미한다. –

+1

하나는 메소드 호출이다. 다른 하나는 컴파일러가 원하는대로 컴파일 할 수 있습니다. –

답변

12

위에서 언급 한 것처럼 HotSpot JVM은 StringBuilder 패턴을 인식하고 고도로 조정 된 수작업 IR 그래프로 바뀌는 -XX:+OptimizeStringConcat 최적화를 가지고 있습니다. 반면 String.valueOf()은 일반 컴파일러 최적화에 의존합니다.

I했습니다 발견 생성 된 어셈블리 코드를 분석하여 다음과 같은 주요 차이점 : Integer.toString에 의해 생성 된 배열이 할당 단지 같은 후 삭제되는 동안

  • 최적화 CONCAT는 결과 문자열을 생성 제로 char[] 배열을하지 않습니다 다른 모든 일반 객체. Integer.getChars 확인 관련 배열 범위와 table lookup을 사용하는 반면
  • 최적화 된 CONCAT는 간단한 addition of '0' constant에 의해 문자로 숫자를 변환 등

PhaseStringOpts::int_getCharsInteger.getChars의 구현에 다른 약간의 차이가 있지만 나는 그들이 생각 성능에 중요한 것은 아닙니다. 당신이 더 큰 숫자 (예 : 1234567890)를 가지고가는 경우에


BTW, 성능 차이가 있기 때문에 한 번에 두 자리 숫자로 변환 Integer.getCharsextra loop의 무시할 수있을 것입니다.

관련 문제