Read Time:2 Minute, 14 Second
Reference: http://developer.android.com/guide/practices/design/performance.html
성능을 위한 디자인
* 기본적으로 할수있다면 임시 객체를 생성하는것을 최대한 피하라. 생성된 객체가 적을 수록 UX(User Experience)에 직접적인 영향을 미치는 가비지 콜렉션(Garbage Collection)이 적게 실행된다.
1. 객체 생성을 피하라
– 입력 데이터에서 문자열을 추출할때, 복사본을 만드는 대신에, 원본 데이터 문자열의 부분만 리턴하여라. String 객체를 만들어야 하겠지만, 그 객체는 원본데이터와 char[]를 공유할 것이다.
– 만약 문자열을 리턴하는 메쏘드가 있고, 그 결과가 항상 StringBuffer에 추가된다면, 임시 객체를 생성하는 대신에 해당 함수가 직접 추가하도록 소스 코드와 프로세스를 수정하여라(의역: change your signature and implementation)
– Integer 배열보다 int 배열이 더 좋다. 그리고 두개의 int 배열들이 (int, int) 객체 배열보다 더 효과적이다. 이 이론은 기본 형(Primitive Type)의 조합에도 적용된다.
– 만약 (Foo, Bar)객체들의 배열(Tuples)를 저장하는 컨테이너(Container)를 구현해야한다면, Custom 객체 (Foo, Bar)의 배열보다는 Foo[]와 Bar[] 배열들이 더 효율적이다.
2. Performance Myths
Previous versions of this document made various misleading claims. We address some of them here.
On devices without a JIT, it is true that invoking methods via a variable with an exact type rather than an interface is slightly more efficient. (So, for example, it was cheaper to invoke methods on a HashMap map than a Map map, even though in both cases the map was a HashMap.) It was not the case that this was 2x slower; the actual difference was more like 6% slower. Furthermore, the JIT makes the two effectively indistinguishable.
On devices without a JIT, caching field accesses is about 20% faster than repeatedly accesssing the field. With a JIT, field access costs about the same as local access, so this isn’t a worthwhile optimization unless you feel it makes your code easier to read. (This is true of final, static, and static final fields too.)
3. Virtual보다 static을 선호하여라
– 객체의 필드에 접근할 필요가 없다면, 당신의 메쏘드를 static으로 만들어라. Static 메쏘드들의 호출은 15%-20% 빨리진다. 메쏘드 시그니쳐(Method Signature)로부터 객체의 상태를 변경시킬수 없는 함수를 호출한다는 것을 알 수 있기 때문에, 이는 또한 좋은 개발방법론이다.
4. 내부 Getters/Setters를 피하라
– C++같은 원시 언어들은, i = mCount 같이 객체에 바로 접근하는 것보다 보통 getters (예제. i = getCount())를 사용한다.
– 안드로이드 프로그래밍에서는 가상 메쏘드를 호출하는 것은 비효율적이기 때문에, 이는 안좋은 방법이다.
– 외부 함수에서는 getters/setter를 사용하지만, 클라스 내부에서는 객체에 직접 접근하라.
5. 상수(Constants)에 Static Final 를 이용하라.
static final int intVal = 42; static final String strVal = "Hello, world!";
6. 강화된 반복문 문법을 이용하여라
– 제일 빠른 아이.
public void two() { int sum = 0; for (Foo a : mArray) { sum += a.mSplat; } }
7. Int 값들을 위하여 Enums를 사용하지 말아라.
8. 내부 함수들에게 패키지 범위(Package Scope)를 사용하여라
9. 적절한 Floating-Point를 사용하라
10. 라이브러리들을 이용하여라.
11. 적절한 네이티브 메쏘드들을 이용하여라.