2010-02-21 3 views
20

왜 두 번째 코드가 더 빠릅니까?자바에서 오토 박싱 대 수동 복싱

Map<Integer, Double> map = new HashMap<Integer, Double>(); 
for (int i = 0; i < 50000; i++) { 
    for (double j = 0.0; j < 10000; j++) { 
     map.put(i, j); 
    } 
} 

Map<Integer, Double> map=new HashMap<Integer, Double>(); 
for (int i = 0; i < 50000; i++) { 
    for (double j = 0.0; j < 10000; j++) {    
     map.put(new Integer(i), new Double(j)); 
    } 
} 
+0

두 부분을 모두 감싸고 다시 마이크로 벤치 마크하십시오. – BalusC

+2

올바르지 않은 인위적인 마이크로 벤치 마크가 아니기 때문에 이것은 실제 세계에서 최적화되지만 JIT는 결국 최적화 될 것이므로 중요하지 않습니다. –

답변

46

Autoboxing은 내부적으로 작은 정수에 대해 Integer 객체를 캐시합니다 (기본값은 -128에서 127이지만 최대 값은 "java.lang.Integer.IntegerCache.high"속성을 사용하여 구성 할 수 있음). 소스 코드를 참조하십시오. of Integer.valueOf)이므로 new Integer을 직접 호출하는 것과 다릅니다. Integer.valueOfnew Integer을 호출하기 전에 정수 값의 크기를 빠르게 확인하기 때문에 new Integer을 직접 호출하는 것이 더 빠릅니다 (작은 정수가 많은 경우 더 많은 메모리를 사용하지만). Java에서의 할당은 매우 빠르며 GC를 수행하는 시간은 수명이 짧은 수명있는 객체 (즉, 가비지의 양에 비례하지 않음)의 수에 비례하므로 GC도 매우 빠릅니다.

그러나 JVM 버전에 따라 최적화가 활성화되어있는 경우 스패너 교체 최적화가 있습니다. 단편 오브젝트를 할당 할 때 훨씬 더 큰 성능 차이가 발생할 수 있습니다 (예 : 최적화를 수행 할 수없는 경우, 객체를 맵에 저장하기 때문에, 다른 많은 상황에서는 유용합니다.)

최근 JVM 버전에서는 scalar replacement 최적화가 있습니다 (이스케이프 분석이 temporarily disabled 인 1.6.0_18 제외). 즉, 수명이 짧은 객체의 할당을 최적화 할 수 있습니다. JVM의 스칼라 대체가 새로운 경우 누군가가 a benchmark 코드를 만든 것과 비슷합니다. 결과는 원시 코드를 사용하는 코드가 가장 빠르다는 것입니다. new Integer() 코드를 명시 적으로 사용하는 코드는 원시 코드를 사용하는 코드보다 훨씬 빠르며, 오토 박싱을 사용하는 코드는 훨씬 느립니다. 이것은 오토 박싱이 Integer.valueOf을 사용하고 적어도 스칼라 교체 최적화가이 특별한 경우를 고려하지 않았기 때문입니다. 그 이후 최적화가 향상되었는지는 모르겠습니다.

+1

"Integer.valueOf는 새로운 정수를 호출하기 전에 정수의 크기를 빠르게 확인하기 때문에". Java Integer는 항상 같은 크기입니다. –

+4

그는 캐시 된 값 범위 내에 있는지 확인하기 위해 전달되는 int 값을 확인합니다. – ColinD

+1

값과 크기의 의미가 다릅니다. –

7

마이크로 벤치 마크 결과가 신뢰할 수 없기 때문에?

또한 자동 생성기는 생성자가 아니라 Integer.valueOf() 및 Double.valueOf()를 사용하여 수행됩니다.

14

Autoboxing은 Integer.valueOfDouble.valueOf을 사용합니다. 이러한 메소드를 호출 할 때 약간의 오버 헤드가 있습니다 (결국에는 인라인 될 것입니다). 또한 Integer.valueOf은 풀링 된 인스턴스를 사용하기 위해 낮은 값을 확인합니다. 코드에서 자주 승리하지는 않습니다 (힙 크기를 약간 줄일 수는 있지만). 풀링 된 인스턴스는 힙 크기, GC 시간을 줄이고 동등성 테스트 성능을 향상시킬 수있는 이점이 있습니다.

그러나 일반적으로 무시해야하는 일반적으로 미세 최적화입니다.

관련 문제