2013-07-15 2 views
1
 for (int i = 0; i < array.length; ++i) { 
      do something referencing array[i] 
      do something referencing array[i] 
      .... 
     } 

이와 같은 코드에서 currentValue = array[i]과 같은 변수를 설정 한 다음 array[i] 대신이 값을 참조하면 실제로 유용할까요? 나는 컴파일러가 그런 식으로 일을 할 정도로 똑똑하고 그러한 코드를 무의미하게 렌더링하는 것처럼 느낀다.Java 컴파일러는 배열 인덱스 조회를 최적화합니까?

+1

기준의 다른 복사본을 만들어 전환하는 장점은 무엇인가? –

+0

JIT는 루프를 다른 루프로 루프시켜 최적화를 시작할 필요가 있습니다. –

+1

일반적으로 하드 번호가 다르게 나타날 때까지 컴파일러가 더 똑똑하다는 것을 신뢰하십시오. –

답변

4

당신은 컴파일러가 당신이 이러한 최적화를하지 않습니다 것을 볼 수 생성하는 바이트 코드를 읽으면. 즉, 해석 모드에서는 배열 조회가 매번 수행됩니다. 루프와 방법이 충분히 여러 번 실행하는 경우 JIT 컴파일러는 또 다른 모습을하고 을 최적화 할 수 있습니다.

결론 : 당신이 예측 가능한 결과를 원하는 경우, 로컬 변수에 배열 요소를 저장합니다. 더 중요한 것은, 그렇게하면 코드가 더 읽기 쉽게됩니다.

+0

최적화되지 않은 개인 변수에 저장하는 것이 예상보다 빠르다는 것을 측정 했습니까? –

+0

@JBNizet - 두 번째 배열 액세스가 제거 될뿐만 아니라 배열 범위가 해당 액세스를 검사하는지 주목하는 것이 좋습니다. 그리고 최적화 된 JITC에서 "규칙"이 JITC가 액세스를 공유하지 못하게하는 경우 두 번째 액세스는 다른 최적화를 "중단시키는"두 번째 잠재적 예외 지점입니다. –

+0

나는 그 점에 동의하고 아마 더 빠를 것이다. 그러나 측정이 없다면, 나는 그것이 맹목적으로 더 빠르다고 가정하지 않을 것이다. 어쨌든 IO, DB 요청 등을 최적화하는 것과 비교할 때 그 영향은 미미할 것입니다. 또한 지역 변수를 도입하는 것이 더 자주 가능하다는 데 동의합니다. –

관련 문제