2011-08-02 6 views
1

코드에 넣으십시오 - 성능이 좋습니다 (차이가있을 경우)?성능, 암시 적 (자동) unboxing 또는 명시 적 unboxing 측면에서 어느 것이 더 낫습니까?

public class Customer 
{ 
    .... 

    public Boolean isVIP(){...} 
    ... 
} 

빠르게 어느된다

이 주어진?

public void handleCustomer(Customer customer) 
{ 
    if (customer.isVIP()) // Auto Unboxing 
    { 
     handleNow(customer); 
    } 
    else 
    { 
     sayHandlingNowButQueueForTomorrow(customer); 
    } 
} 

나이 : 자동 언 박싱 그냥 문법 설탕 때문에

public void handleCustomer(Customer customer) 
{ 
    if (customer.isVIP().booleanValue()) // Explicit unboxing 
    { 
     handleNow(customer); 
    } 
    else 
    { 
     sayHandlingNowButQueueForTomorrow(customer); 
    } 
} 
+0

"내재적 인"의미를 가지고 있다고 생각합니다.* 명시 적 * –

+0

@matt - 10x, 질문을 업데이트했습니다. – RonK

답변

10

그들 사이의 차이, 당신은 바이트 코드에서 확인할 수 있습니다이로 컴파일

public class ImplicitTest { 
    public static void main(String[] args) { 
     Boolean b = true; 
     boolean i = b; 
     boolean e = b.booleanValue(); 
    } 
} 

: 당신이 볼 수 있듯이

은 javap -c ImplicitTest

Compiled from "ImplicitTest.java" 
public class ImplicitTest extends java.lang.Object{ 
public ImplicitTest(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 

public static void main(java.lang.String[]); 
    Code: 
    0: iconst_1 
    1: invokestatic #2; //Method java/lang/Boolean.valueOf:(Z)Ljava/lang/Boolean; 
    4: astore_1 
    5: aload_1 
    6: invokevirtual #3; //Method java/lang/Boolean.booleanValue:()Z 
    9: istore_2 
    10: aload_1 
    11: invokevirtual #3; //Method java/lang/Boolean.booleanValue:()Z 
    14: istore_3 
    15: return 

} 

- 라인 (5), 6,9 (암시 적)은 10, 11, 14 (명시 적)와 동일합니다.

7

의 차이는 모두 컴파일시에해야한다. 이 경우 생성 된 Java 바이트 코드는 정확히 동일해야합니다. 이는 런타임에 차이가 없음을 의미합니다. 그러나보다 일반적인 경우 명시 적 unboxing은 더 빠를 수 있습니다. 왜냐하면 암시 적 unboxing은 값을 두 번 이상 unbox 할 수 있기 때문에 명시 적 unboxing을 사용하면 값이 한 번만 언 박싱되고 결과가 저장된다는 것을 보장 할 수 있습니다.

+0

자동 반복 해제의 가능성에 대해 당신이 맞습니다. 운좋게도 그건 제 경우가 아닙니다. – RonK

+0

이 답변은 받아 들여진 것보다 낫습니다. 한 가지 예를 넘어선 일반화가 unboxing이 일반적으로 어떻게 수행 할 수 있는지에 대한 원리를 말해주기 때문입니다. – LarsH

3

성능면에서 그들은 이상적으로 동일해야합니다.

인간의 작문 기법이 약간 덜 최적화되어 있기 때문에 인간이 작성한 오토 바이크 방법을 제대로 수행하지 않으면 성능이 저하 될 수 있습니다. 그러나 실제로 그것에 도달하고 싶다면 인간이 기본 성능을 능가하는 일종의 비 일반적인 솔루션을 작성할 수있는 기회가 있습니다. 그러한 솔루션은 유연하지 않을 것이고 아마도 큰 조회 배열과 같은 메모리에 대한 계산상의 복잡성을 상쇄하게 될 것입니다.

개인적으로, 나는 더 큰 그림을보기 위해 시간을 좀 내주는 것이 좋습니다. 한 줄 또는 두 줄의 코드를 최적화하는 것은 결코 좋은 투자가 아닙니다. 전체 프로그램에서 필요한 작업량을 줄이면 성능이 향상됩니다.

일반적으로 JVM은 autoboxing의 도입과 함께 변경되지 않았 음을 유의하십시오. 따라서 컴파일러는 가장 일반적인 경우 수동으로 작성하는 것과 동일한 명령어를 추가합니다. 런타임시 JVM에서 성능이 측정되며, 동일한 바이트 코드라면 성능 차이가 발생할 이유가 없습니다.

이것은 조숙 한 최적화에 불과하지만 시간에 차이를 느낄 수 있다고 생각한다면 신중한 테스트를 통해 확인한 다음 다른 릴리스, 운영 체제 등에서 다를 수 있음을 알아 두십시오. 어쨌든 명확한 컷 우승.

+0

이 단일 행이 성능 문제를 해결할 것이라고 생각하기 때문에 저는 묻지 않습니다. Java 1.4 용으로 작성된 코드의 결과 인 '.booleanValue()'로 코드베이스가 채워지는 것을 보았습니다. 암시 적 언 박싱으로 전환하여 응용 프로그램 전체에서 성능 저하가 발생하지 않도록하고 싶었습니다. – RonK

+0

이미 수동으로 코드를 작성한 경우 자동 폭화를 사용하지 말 것을 권장합니다. 기본적으로 컴파일러는 ".booleanValue()"를 눈에 보이지 않게 추가합니다. 나는 "보이지 않는"코드의 팬이 아닙니다. 이 경우 컴파일러가 자동으로 StringBuilder를 생성하고 "String"+ "String"+ "String"루틴을 처리하는 추가 작업을 수행합니다. 어쩌면 다소 과장 될 수 있지만, 나는 생성자에서'super()'에 명시 적 호출을 추가하는 경향이있다. 다른 말로하면 6 명에서 1 명, 또는 다른 사람에서 6 명입니다. –

0

boolean 대신 Boolean을 반환해야하는 VIP입니까?

+0

불행히도 예 ... (VIP는 단지 예일뿐입니다. 우리는 수십 가지가 있습니다 ...) – RonK