IT story

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

hot-time 2020. 7. 19. 09:14
반응형

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


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

에서처럼 :

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

대:

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

에서 bar읽고 수정되지 않았다고 가정합니다 foo().


최종 키워드는 로컬 변수 및 매개 변수의 클래스 파일에 나타나지 않으므로 런타임 성능에 영향을 줄 수 없습니다. 변수가 변경되지 않음 (많은 사람들이 그 이유를 모호한 이유라고 생각)과 익명의 내부 클래스를 다루는 코더의 의도를 명확히하는 것만 사용됩니다.

어쨌든 수정 자에 관계없이 런타임에 최적화 컴파일러가 메소드를 인라인 할 것이기 때문에 메소드 자체의 최종 수정 자에게 성능 향상이 있는지 여부에 대해 많은 논란이 있습니다. 이 경우에는 메소드의 재정의를 제한하는 데만 사용해야합니다.


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


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

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

아 그리고 또 다른 좋은 자료

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


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


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

그러나 이것이 실제로 수행된다면 단서가 없지만 메모리를 절약하기 위해 수행 될 수 있습니다.

참고 : https://stackoverflow.com/questions/266806/is-there-any-performance-reason-to-declare-method-parameters-final-in-java

반응형