나는이 글을 읽는했다 :최종적으로 안드로이드에 대한 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 용 문서가 아닙니다. 성능 팁에 대해 .. 오래된?
메소드 선언 앞에있는 final은 단지 재정의 할 수 없다는 것을 의미합니다. 컴파일 시간 확인입니다. 그들은 직접 변수에 접근하는 것에 비해 메소드를 호출하는 것에 대해 이야기합니다. 그건 ... 거의 누구나 그 최적화를 필요로하지 않으며 변수에 액세스하는 것이 아니라 getter를 호출하기위한 많은 설계 이유가 있음을 알 수 있습니다. 아니, 대부분의 경우 Java에서 "const correctness"라는 개념이 없습니다. –
@BrianRoach 예, '내부적으로 항상 필드에 직접 액세스해야 함'을 읽었을 때 나는 몸을 움츠 렸습니다. 나는 getter와 setter에 넣을 수있는 유연성과 임시 안전 점검을 좋아합니다. 그래서 .. final이라고 표시된 메소드가 ** 여전히 ** 가상 메소드라는 것을 의미합니까? 나는 const-correctness가 "final-correctness"와 같지 않다는 것을 안다. 그렇게 부르면 중요 하겠지만? "도끼로 너를 죽일거야."중요한 건 중요하니? –
수정하십시오. 모든 메소드는 클래스 로더에 의해 런타임에로드됩니다. JIT는 인라이닝 (inlining)을 통해 개선 할 수 있지만 그 자체만으로도 충분합니다. –