2013-06-18 1 views
2

나는이 글을 읽는했다 :최종적으로 안드로이드에 대한 getters와 setter는 괜찮습니까? const 정확성이 C++에서와 같이 최종 정확성이 Java에서 중요합니까?

http://developer.android.com/training/articles/perf-tips.html 특히이 내부 getter 및 setter에 대한 :

가상 메서드 호출이 비싼보다 훨씬 더 인스턴스 필드 조회. 일반적인 객체 지향 프로그래밍 방법을 따르고 공용 인터페이스에서 getter 및 setter를 사용하는 것이 합리적이지만 클래스 내에서 항상 필드에 직접 액세스해야합니다.

JIT가 없으면 직접 필드 액세스는 간단한 게터를 호출하는 것보다 약 3 배 빠릅니다. JIT (직접 필드 액세스가 로컬 액세스만큼 저렴)를 사용하면 직접 필드 액세스가 간단한 게터를 호출하는 것보다 약 7 배 더 빠릅니다.

"가상 메소드 호출"은 아마도 공용 메소드도 참조합니다. 메서드를 오버라이드해서는 안되는 클래스의 메서드가 여러 개 있습니다. 예를 들어 :

public class Something { 
    private float m_Float = 0.0f; 
    public float getFloat() { 
     return m_Float; 
    } 
} 

나는 항상 'getFloat는()'도 파생 클래스에서, 'm_Float'를 반환합니다. 메소드 '최종'을 표시하면 Android 기기의 성능이 향상됩니까? 그렇지 않더라도 최종 정확성은 const 정확성만큼 중요합니까? 마찬가지로, 동료 프로그래머가 최종 정확성을 잊었을 때 Java 프로그래머가 항문 해낼 수 있습니까?

final 메서드를 표시하면 성능이 향상됩니다. 성능 향상은 다음과 같이 무효화됩니까?

public class Base { 
    public int getRandomNumber() { 
     return 4; //chosen by fair dice roll. 
        //guaranteed to be random. 
    } 
} 
public class Derived extends Base { 
    public final int getRandomNumber() { 
     return 6; //chosen by second fair dice roll. 
        //guaranteed to be more random. 
    } 
} 

나는이 시점에서 내 코드를 최적화에 정말 관심 없어하지만 난 최종 정확성 비트에 관심이 있어요 .. 나는 표준 규칙 자바의 관심에 익숙하지 않다.

는 는 [EDIT]

는 , 그래서, 상술 된 바와 같이, 이러한 링크가 가능한 응답으로 주어진 좋아

: 이에 응답 링크로 표시

회신은 : What optimizations can I expect from Dalvik and the Android toolchain?

심플 보인다 getters 및 setters가 지금 인라인됩니다.

진저 브레드에서 우리는 게터/세터에 간단한 인라이닝을 추가했습니다. 기본 JIT 프론트 엔드는 여전히 간단한 추적 기반이므로, 호출 수신자가 거기에 분기를 가지면 인라인되지 않습니다. 그러나 가상 getter/setter가 문제없이 인라인 될 수 있도록 인라인 캐시 메커니즘이 구현됩니다.

그리고 코멘트에

,이이 요구된다

(3) 나는 내 방법이 어디 최종 수 선언해야 하는가? 또는 여전히 가상 전화 사이트로 간주됩니까?

(3) 예

그래서, 여기에 의견과 이것 저것으로, 나는 모든 것이 해결 말하고 싶지만하십시오

는 그리고 이것은 응답이다.

[편집]

( final이 방법과 함께 사용되어야 할 때를 제외하고.하지만 아마 곧 대답 할 것이다 나는 믿음을 가지고 있지만 그것을 검증하거나 이유 반박 얻을 기다리고, 그래서 ..)

또한 Android 용 문서가 아닙니다. 성능 팁에 대해 .. 오래된?

+3

메소드 선언 앞에있는 final은 단지 재정의 할 수 없다는 것을 의미합니다. 컴파일 시간 확인입니다. 그들은 직접 변수에 접근하는 것에 비해 메소드를 호출하는 것에 대해 이야기합니다. 그건 ... 거의 누구나 그 최적화를 필요로하지 않으며 변수에 액세스하는 것이 아니라 getter를 호출하기위한 많은 설계 이유가 있음을 알 수 있습니다. 아니, 대부분의 경우 Java에서 "const correctness"라는 개념이 없습니다. –

+0

@BrianRoach 예, '내부적으로 항상 필드에 직접 액세스해야 함'을 읽었을 때 나는 몸을 움츠 렸습니다. 나는 getter와 setter에 넣을 수있는 유연성과 임시 안전 점검을 좋아합니다. 그래서 .. final이라고 표시된 메소드가 ** 여전히 ** 가상 메소드라는 것을 의미합니까? 나는 const-correctness가 "final-correctness"와 같지 않다는 것을 안다. 그렇게 부르면 중요 하겠지만? "도끼로 너를 죽일거야."중요한 건 중요하니? –

+2

수정하십시오. 모든 메소드는 클래스 로더에 의해 런타임에로드됩니다. JIT는 인라이닝 (inlining)을 통해 개선 할 수 있지만 그 자체만으로도 충분합니다. –

답변

1

개인적으로 이외의 문자로는 final을 사용하지 않는 것이 좋습니다. 개발의 꽤 몇 년 동안 나는 final 다른 좋은 그 사용을 보지 못했고 그 상수는 static final ...입니다. final 키워드는 특히 테스트 할 때 번쩍 거리며 - 이 final class 일 때는 PowerMock과 같은 것을 사용해야합니다. 높은 테스트 커버리지를 원한다면.

의심스러운 경우 현실적인 성능 테스트를 수행하고 두 시나리오를 프로파일 링하십시오. 눈에 띄는 차이가 없으면 코드에 final과 같은 제한을 추가하지 마십시오. 문 좋아 :

직접 필드 액세스 일부 실수없이

은 매우 의미가 사소한 게터를 호출보다 약 3 배 빠르다. 사소한 getter를 호출하는 데 20 마이크로 초 밖에 걸리지 않으면 60 마이크로 초로 비용을 높이는 것은 의미가 없습니다. 모바일 응용 프로그램의 경우 getters & 설정자가 성능 문제를 일으키지 않습니다.

정확성, 가독성 초 및 그 이후의 유지 관리 가능성에 대해 항상 코드를 작성하십시오.

+0

클래스의 정적이 아닌 최종 필드, 특히 스레드간에 이동할 수있는 변경 불가능한 클래스에 대해 이야기 할 때는 매우 유용합니다. –

+0

직접 필드 액세스는 모바일에서도 수 나노초 이상 걸리지 않습니다. – assylias

+0

정확도 "최종 정확도"와 비슷합니까? 내 말은, 상수에 대한 'final'과 'static final'은 모두 좋지만 모든 메소드를 재정의하면 기본 클래스에서 파생 된 클래스에 예상되는 메소드의 동작이 변경된다는 의미입니다. –