이 글은 http://developer.android.com/training/articles/perf-tips.html 의 내용을 참고하여 작성되었습니다.

 

# Prefer Static Over Virtual

Object의 field에 접근할 필요가 없는 method는 접근자를 static으로 선언하라!

method 호출 시간을 15% ~ 20% 개선시킬 수 있고,

method가 Object의 state를 변경하지 않는다는 사실을 명시적으로 노출하기 때문에 1석 2조다.

 

# Use Static Final for Constants.

Class에 위와 같이 선언이 되어 있다고 생각해보자.

Compiler가 <clinit>이라는 class initializer method를 생성한 뒤, class가 처음 사용될 때 <clinit>이 호출되어 intVal에 42라는 값을 넣고, classfile string constant table에서 strVal에 해당하는 reference를 추출한다.

이후 해당 field의 값을 요청하면, field lookup과정을 통해 value를 반환한다.

 

아래와 같이 ‘final’ keyword를 추가하면 상수에 대한 접근 시간을 개선시킬 수 있다.

Android에서 상수는 dex file의 static field initializer에 선언되기 때문에 위의 Class는 더이상 <clinit> method를 필요로 하지 않는다.

intVal을 참조하는 Code는 intVal의 값인 42를 바로 사용할 것이다.

strVal에 접근하는 경우에는 field lookup보다 상대적으로 빠른 “string constant” 명령어를 사용할 것이다.

 

profiling static final vs static.

static (ns) static final (ns)
1 457,764 396,729
2 427,246 91,553
3 335,694 152,588
AVG 406,901 213,623

 

Note : 위의 최적화는 primitive typeString constant에 대해서만 적용할 수 있다.