Java에서 메소드 매개 변수를 final로 선언하는 성능 이유가 있습니까? 같이 : public void

Java에서 메소드 매개 변수를 final로 선언하는 성능 이유가 있습니까?

에서와 같이 :

public void foo(int bar) { ... }

대:

public void foo(final int bar) { ... }

그것이 bar읽기 전용이고 foo().



답변

final 키워드는 로컬 변수 및 매개 변수에 대한 클래스 파일에 표시되지 않으므로 런타임 성능에 영향을 미치지 않습니다. 유일한 용도는 변수가 변경되지 않도록 (많은 사람들이 사용에 대한 모호한 이유를 고려하는) 코더 의도를 명확히하고 익명의 내부 클래스를 처리하는 것입니다.

메서드는 수정 자에 관계없이 어쨌든 런타임에 최적화 컴파일러에 의해 인라인되므로 메서드 자체의 최종 수정자가 성능 향상을 가져 오는지에 대한 많은 논쟁이 있습니다. 이 경우 메서드 재정의를 제한하는 데만 사용해야합니다.


답변

최종 매개 변수의 유일한 이점은 익명 중첩 클래스에서 사용할 수 있다는 것입니다. 매개 변수가 변경되지 않으면 컴파일러는 최종 수정 자 없이도 정상 작동의 일부로 이미이를 감지합니다. 매개 변수가 예기치 않게 할당되어 버그가 발생하는 경우는 매우 드뭅니다. 메소드가이 수준의 엔지니어링이 필요할만큼 충분히 크면 작게 만드십시오. 호출하는 메소드는 매개 변수를 변경할 수 없습니다.


답변

JIT 컴파일러와 같이 클래스로드 후에 작동하는 컴파일러는 최종 메서드를 활용할 수 있습니다. 결과적으로 final로 선언 된 메서드는 성능상의 이점을 가질 수 있습니다.

http://www.javaperformancetuning.com/tips/final.shtml

아 그리고 또 다른 좋은 자원

http://mindprod.com/jgloss/final.html


답변

메서드 내에서 선언 된 비 최종 지역 변수를 사용하는 것보다 한 가지 더 강조하면 내부 클래스 인스턴스가 스택 프레임보다 오래 지속될 수 있으므로 내부 개체가 아직 살아있는 동안 지역 변수가 사라질 수 있습니다.


답변

컴파일러가 int와 같은 기본 유형을 가진 모든 개인 정적 최종 변수를 제거하고 C ++ 매크로와 마찬가지로 코드에서 직접 인라인 할 수 있다고 가정합니다.

그러나 이것이 실제로 수행되는지 여부는 알 수 없지만 약간의 메모리를 절약하기 위해 수행 할 수 있습니다.