일부 자바 원시 컬렉션 (trove, fastutil, hppc)을 살펴 봤는데 클래스 변수가 final
로컬 변수로 선언되는 패턴을 발견했습니다. 예를 들어 :Java의 클래스 변수보다 최종 로컬 변수에 액세스하는 것이 빠릅니까?
public void forEach(IntIntProcedure p) {
final boolean[] used = this.used;
final int[] key = this.key;
final int[] value = this.value;
for (int i = 0; i < used.length; i++) {
if (used[i]) {
p.apply(key[i],value[i]);
}
}
}
좀 벤치마킹을했습니다, 그리고이 일 때 약간 빠른 것 같습니다,하지만 왜이 사건인가? 함수의 처음 세 줄을 주석으로 처리하면 Java가 어떻게 다른지 이해하려고합니다.
참고 : 이것은 this question과 유사하지만 C++ 용이며 final
으로 선언 된 이유는 설명하지 않습니다.
당신은 차이를보기 위해 생성 된 자바 어셈블리를 들여다 볼 수 있습니다. –
그냥 그 이유가 HotSpot 컴파일러가 아닌 바이트 코드 자체에있을 수 있다는 것을 깨달았습니다. –
벤치 마크 코드를 게시하십시오. 메소드를 잘못 벤치마킹하여 컴파일러가 아니라 인터프리터 만 테스트했습니다. – Voo