2010-04-06 4 views
5

을 초래 않습니다 밀고 당겨서 궁극적으로 코드를 늦추시겠습니까?는 자바 게터 성능 저하

+1

진공 성능 문제는 쓸모가 없습니다. 애플리케이션에서 성능에 민감한 스트립에 있다고 판단한 후 직접 프로필을 작성하십시오. – djechlin

답변

4

JIT 컴파일러는 메소드를 인라인합니다.

코드는 내가 당신을 위해 두 개의 답변이

int b = obj.GetA(); 
+0

그건 맞지 않아. C/C++ 컴파일러는 이런 종류의 기능을 인라인하지만 Java에서는 함수가 참조되는지 여부 (AOP, AspectJ 등)를 VM이 알지 못하기 때문에 수행 할 수 없습니다. – cletus

+1

@cletus VM은 모든 자바 바이트 코드 명령어를 해석하므로, AspectJ와 같은 바이트 코드 제직 도구로 이루어진 수정조차도 인식하고있다. –

+0

@binil, Michael : getter가 최종적으로 나오지 않으면 어떻게 동작 할까? getter를 재정의하는 하위 클래스는 어떻습니까? – Thilo

3

과 같아야합니다

  1. 내가 직접 변수에 접근 대 게터를 사용하기위한 상당한 성능 저하가 있다고 생각하지 않는다 . 코드가 이런 종류의 결정을 수행하는 것보다 얼마나 이해할 수 있고 읽기 쉬운 지에 대해 더 걱정할 것입니다.
  2. OO 디자인 원칙에 따르면 사용자에게 중요하거나 중요하지 않을 수도 있지만 일반적으로 데이터를 숨기고 해당 데이터에 액세스하는 게터 방법을 제공합니다. — here의 장점에 대한 자세한 설명이 있습니다.
+0

한편, get 메소드는 캡슐화를 종종 중단합니다 (특히 set 메소드를 사용하는 경우). –

1

이론적으로 메소드 호출로 인해 런타임 페널티가 있습니다. 실제로,이 두 가지 이유 때문에 전반적인 성능에 거의 영향이 있습니다

  1. 프로그램의 가장 안쪽 루프 내에서 일어나고있는 obj.getA()하지 않는 한, 코드의 전반적인 성능에 다음의 효과를 않습니다 무시할 만하다. 성능이 문제가되면 코드의 병목 현상을 고려해야합니다. 이 핫 스폿에없는 코드를 최적화 할 필요가 없습니다. 이러한 지점을 확인하려면 profiler을 통해 코드 실행을 분석해야합니다.
  2. @Michael은 JVM이 실제 실행을 기반으로 코드를 인라인하는 "Just In Time"컴파일러/최적화 프로그램을 사용한다고 말했기 때문입니다. 이러한 종류의 최적화를 수행합니다 (talk 참조).