2011-07-03 3 views
2

경계 검사를 제거하여 코드 실행을 최적화 할 수있는 JVM을 일부 읽었습니다. 알아 내고자하는 것은 코딩 기술이 더 잘 작동하는 것입니다. 아래 예 1에있어서에서Java 경계 검사 최적화 예제

는 JVM 적으로 파악하고 소스 [인덱스] 기준의 검사 범위를 제거 할 것인가?

예 2 더 나은 코드 연습은 무엇입니까? 그렇게 보일 수도 있지만 루프 내부의 일부 알고리즘에서는 범위를 벗어나는 인덱스가 정상 조건입니다. 따라서 루프 내에서 수많은 Exception 객체를 생성하고 싶지는 않습니다.

이 코드 단편은 단지 설명의 대상입니다. 이 예제에서 경계 검사는 성능에 거의 영향을 미치지 않는다는 것을 알고 있습니다. 그러나 여분의 경계 검사가 추가됩니다 임베디드 프로토콜 응용 프로그램에서 일하고 있습니다.

+0

[This] (http://www.ssw.uni-linz.ac.at/Research/Papers/Wuerthinger07/Wuerthinger07.pdf) 일부 동료의 종이는 당신에게 흥미로워 야합니다. 나는 그 변화가 핫스팟에 통합되었지만 확실하지 않다고 생각한다.어쨌든 두 번째 예제는 퍼포먼스와 코딩 프랙티스 관점에서 분명히 나쁘다. – Voo

+0

@AlanObject, 경계 검사는 출력에 대한 호출보다 작은 크기의 많은 순서입니다. 대부분의 경우 차이가 없습니다. –

답변

5

첫 번째 질문에 대해서는 경계 검사가 이론적으로는 일 수 있습니다. 최선의 현대적인 JIT 컴파일러가 (예를 들어, 소스 [인덱스]가 확장 될 때 경계 검사에서 일반적인 하위 표현식 제거를 통해)이를 수행 할 것으로 기대합니다. 늘 그렇듯이 구현 의존적이므로 의존 할 수 없습니다. OTOH 경계 검사가 제거되지 않는 경우에도 그 차이는 사소 할 것입니다. 즉, 이미 캐시 된 메모리 위치를 source.length로 지정하고 두 개의 정수 비교를 수행하므로 오버 헤드가 작습니다.

example2는 좋은 습관이 아닙니다. 예를 들어 예외를 치는 것입니다.하지만 아무 일도 일어나지 않는 것처럼 계속 잡아라. stdout을 면밀히 관찰하지 않는다면 코드에 버그가 있다는 사실을 완전히 놓칠 수도 있습니다.

은 "인덱스"에 대한 유효한 입력으로 간주 내용에 따라 기본적으로 두 가지 일반적인 "좋은"가능성이 있습니다

  1. 인덱스 값이을 예상하고 있습니다 범위를 벗어날은 유효한 입력으로 간주됩니다. 에서는 example1과 같이 을 명시 적으로 테스트하고 처리해야합니다. 이 경우 어떠한 예외도 throw하지 않아도됩니다.

  2. 범위를 벗어나는 인덱스는 예상치 못한입니다 (따라서 호출 코드의 버그입니다). 코드에서 여기에서 예외가 발생해야합니다. 원하는 경우 자신의 메시지로 예외를 포착하고 다시 throw 할 수 있지만 IndexOutOfBounds 예외가 전파되도록 할 수도 있습니다. 이 예외 처리의 성능에 미치는 영향에 대해 걱정하지 마십시오 - ..... 그냥 버그를 발견하고, 따라서 당신은 프로그램이 "큰 소리로"그것은 가능한 한 빨리 실패 할

+1

좋은 답변입니다. 하지만 stdout으로 인쇄하는 것은 다른 유스 케이스를 보여주기위한 것이라고 생각합니다. – Dunes

2

I 돈 범위를 벗어나는 인덱스가 정상적인 상태가 될 수있는 방법을 알지 못합니다. 알고리즘에 버그가 있거나 입력을 올바르게 검증하지 않았습니다. 이 경우 입력의 유효성 검사는 인덱스가 범위 내에 있는지 확인하는 것으로 구성됩니다. if (첫 번째 스 니펫 에서처럼)을 사용하여 확인하는 것은 예외를 잡는 것보다 분명하고 훨씬 깨끗하며 효율적입니다.

+0

네트워크 패킷을 디코딩 할 때 배열의 색인은 종종 패킷 자체의 데이터로 계산되므로 손상 될 수 있습니다. 코드는 잘못된 패킷을 정상적으로 처리해야합니다. C 코드에서 그렇게하지 않으면 일반적으로 많은 보안 취약점의 기초가됩니다. – AlanObject

+0

예. 그것이 내가 "입력 검증"이라고 부르는 것입니다. 여기서 입력은 데이터에서 계산 된 인덱스입니다. 손상된 패킷을 정상적으로 처리해야하는 경우 인덱스가 경계에 있는지 확인하고 이에 따라 조치하십시오. 그러나 if 문을 사용하여 검사를 구현해야하며 IndexOutOfBoundsException을 포착해서는 안됩니다. –