2012-09-12 2 views
1

최근 정적 코드 분석 도구 (PMD)가 분기 수가 너무 적은 switch 문에 대해 불만을 표시하는 상황에 부딪 혔습니다. 그것은 더 많은 경우가 추가 될 것이라는 것을 알았 기 때문에 내가 원하지 않는 if 문으로 바꿀 것을 제안했습니다. 그러나 javac이 그런 최적화를 수행하는지 아닌지 궁금했습니다. 나는 JAD를 사용하여 코드를 디 컴파일했지만 여전히 스위치를 보여 주었다. 이것이 JIT에 의해 최적화 된 런타임 일 수 있습니까?jit가 너무 적은 분기로 switch 문을 최적화합니까?

업데이트 : 제 질문의 맥락으로 오해하지 마십시오. 나는 PMD에 대해 묻지 않는다. 마이크로 최적화의 필요성에 대해서는 묻지 않는다. 질문은 분명히 단지 이것이다 : 현재의 (Oracle 1.6.x) JVM 구현에는 스위치를 다루는 JIT가 포함되어 있는가? 몇몇 가지 또는 아닙니다.

+0

내가 PMD가 함께 할 수 없다 생각 JIT? – gefei

+0

물론 그렇지 않습니다. 질문은 그 것이 아니었다 .. – jabal

답변

1

입니다. 그렇지 않으면 모든 디버깅 시도가 행 번호 및 원래 명령 흐름과 같은 일부 정보를 놓치게됩니다.
따라서 프로덕션 모드로 컴파일하고 디 컴파일 결과가 무엇인지 확인할 수 있습니다.

그러나 switch 문은 일반적으로 커질 것으로 예상되는 경우 일반적으로 코드 냄새로 간주되므로 리팩토링에 적합한 후보로 평가해야합니다.

0

javac 성능이 거의 최적화되지 않았습니다. 모든 최적화는 JIT를 사용하여 런타임에 수행됩니다. 성능 문제가 있다는 것을 알지 못한다면 나는 그렇지 않다고 추측합니다.

PMD가 불평하는 것은 명확합니다. 예 : 디버그 모드에서 컴파일 된 경우

if (a == 5) { 
    // something 
} else { 
    // something else 
} 

은 당신이 그것을 디 컴파일 할 때, 당신은 여전히 ​​스위치를 얻을 정상입니다, 명확보다는

switch(a) { 
    case 5: 
     // something 
     break; 
    default: 
     // something else 
     break; 
} 
+1

JIT가이 특정 최적화를 수행하는지 여부는 문제였다. – jabal

1

질문의 내용을 명확히 한 후에.

이것은 하드웨어와 JVM에 강력하게 적용되기 때문에 (JVM 사양을 고수하는 한 Java 상표를 사용하는 JVM은 Oracle 이외의 회사에서 개발할 수 있습니다.) Id는 유효한 유일한 방법은 속도 테스트.

코드 덩어리를 잘라내어 상당한 양의 반복을 위해 루프에 잠그고 루프 실행 전후의 시간을 확인하십시오. 당신은이


등 두 솔루션을 반복 (스위치 경우)

이 단순하고 어리석은 것처럼 보일 수 있지만, 실제로는 바이트 코드를 통해 읽기, 빠른 디 컴파일보다 훨씬을 작동하고 있고 메모리 덤프 Java가 실제로 가상 머신과 바이트 코드를 사용한다는 것을 기억하십시오. 임 꽤 확신이 다 처리되고 최적화 된. 우리는 당신이 묻는 마이크로 관리와 최적화를 피하기 위해 고수준 언어를 사용하고 있습니다.

좀 더 일반적으로, 저는 조금 더 빨리 최적화하려고합니다. 스위치에서 더 많은 경우가 발생할 것이라는 것을 안다면 왜 전혀 귀찮아하지 않습니까? 프로파일 러를 실행 했습니까? 그렇지 않다면 최적화하지 않습니다. "조기 최적화는 모든 악의 뿌리입니다." 병목 현상을 실제로 일으키지 않는 코드 부분을 최적화하거나 코드 복잡성을 심어 주거나 ​​어떤 방식으로도 기여하지 않는 코드를 작성하는 데 시간을 낭비 할 수 있습니다.

당신이 만드는 응용 프로그램의 유형을 모르지만 엄지 손가락의 규칙은 선명도가 왕이된다고 말하면서 일반적으로 더 단순하고 더 우아하고 자체 문서화 된 솔루션을 선택해야합니다. JIT 컴파일러 스위치 문을 최적화하는 방법을

+0

질문은 초기/불필요한 최적화와 관련이 없습니다. JIT가 작동하는 방식에 대해서 궁금해 할 것입니다. – jabal

2

방법은 결정 중 하나

  • 은으로 JVM을 실행하는 JIT 컴파일러 소스 코드 (오픈 JDK 6과 7은 오픈 소스) 또는
  • 읽기 스위치는 관심 클래스에 대한 JIT 컴파일 코드를 파일에 덤프하도록 지시합니다.

성능 및 최적화와 관련된 모든 질문과 마찬가지로 대답은 하드웨어 플랫폼과 JVM 공급 업체 및 버전에 따라 달라집니다.

는 참고 :이 질문은 "단순한 유휴 호기심이"Disassemble Java JIT compiled native bytecode


경우, 그래서를합니다.

그러나 성능상의 이유로 switch 또는 if을 사용하도록 코드를 다시 작성하면 나쁜 생각이거나 시간이 낭비 될 수 있습니다. 가능성은 원래 최적화 된 버전과 손 사이의 시간차는 (만약 있다면) 크지 않을 것이라고 때문에

  • 그것은 아마도 시간 낭비이다.

  • 귀하의 최적화는 특정 하드웨어 및 JVM 조합에만 유용 할 수 있으므로 바람직하지 않습니다. 다른 사람들에게는 아무런 영향이 없거나 반대로 최적화되지 않을 수도 있습니다.

요약하면 JIT 최적화 프로그램이이를 어떻게 처리하는지 알지만 프로그래밍에서 고려하지 않아야합니다.

은 (당신이 진짜 측정 성능 문제가 있고, 병목 현상의 하나로서 3 가지 switch) 말 (에 포인트를 프로파일 링 할 때 물론 예외입니다.)

관련 문제