해당 포스트는 "자바 성능 튜닝 이야기" 책의 내용을 요약한 것이다.



: 안드로이드는 일반 자바 JVM에서 수행되지 않는다. 안드로이드 코드는 javac을 통해서 컴파일이 수행되 클래스 파일이 되고 dex 라는 구글에서 제공하는 컴파일러에 의해서 컴파일이 되 Dalvik VM에서 프로그램이 수행된다. 또한 일반적인 PC나 서버 장비는 디스크 영역을 메모리처럼 사용할 수 있는 SWAP이 있지만 안드로이드에는 존재 하지 않는다. 안드로이드 개발을 할 때는 작은 부분이라도 메모리를 생각하면서 개발해야 한다. 또한 안드로이드 앱은 서버 애플리케이션처럼 만들 경우 성능 저하가 매우 심하다. 아주 단순한 코드라도 안드로이드에서는 성능 개선이 된다.  


※ 구글에서 제공하는 안드로이드 성능 개선 방법

1. Avoid Creating Unnecessary Objects : 필요 없는 객체 생성은 피하라

ex)

- String 대신 StringBuffer을 사용한다.

- integer 배열 대신 int 배열을 사용한다.

- 다차원 배열 대신 1차원 배열을 사용한다.

=> 작은 것부터 신경 써야 객체가 적게 생성되고 GC도 적게 발생한다.


2. Prefer Static Over Virtual : static을 적절히 사용하자. 인스턴스 변수에 접근할 일이 없을 경우엔 static 메서드를 사용하는 게 15~20% 성능 개선이 이루어진다.


3. Use Static Final For Constants : 상수는 static final을 사용하자. static final로 선언할 경우와 static으로 선언할 때 저장되고 참조되는 위치가 다르다. static fianl이 접근 속도가 훨씬 빠르다.


4. Avoid Internal Getters/Setters : 내부에서는 getter와 setter 사용을 피하자. 인스턴스 변수에 접근하는 것이 getter나 setter을 사용하여 접근하는 것보다 훨씬 빠르다.


5. Use Enhanced For Loop Syntax : 개선된 for 루프를 사용하자. Iterator을 통해 전통적인 for문을 사용하는 것보다는 for-each를 사용하는 게 성능상 좋다. 하지만 ArrayList는 전통적인 for 루프가 3배 빠르다.


6. Consider Package Instead of Private Access with Private Inner Classes : private한 Inner 클래스의 private 접근을 피해라. VM에서는 내부 클래스와 감싸고 있는 클래스를 다른 클래스로 인식한다. 따라서 컴파일러는 감싸고 있는 클래스의 private 변수에 접근할 수 있는 메서드를 자동으로 생성해 준다. 따라서 변수에 직접 접근이 불가능 하므로 성능이 저하된다.


7. Avoid Using Floating-Point : 소수점 연산을 피해라. 안드로이드에서는 정수 연산보다 소수점 연산이 2배 느리다. 그리고 double이 float보다 2배의 저장공간을 사용하므로 가능하면 float를 사용해라.


8. Know and Use the Libraries : 라이브러리를 알고 사용해라. API에서 제공하는 클래스와 메서드가 우리가 만든 코드보다 훨씬 빠를 수 있다. 예로 배열을 복사할 때 System.arraycopy() 메서드를 사용하면 9배 이상 빠르다.


9. Use Native Methods Carefully : Native 메서드는 유의해서 사용해라.


※ 안드로이드 분석, 최적화 툴

- DDMS : Dalvik Debug Monitor Server의 약자로 안드로이드 기기와 상호작용하는 정보를 그래픽 UI로 제공한다.

- Systrace : 가장 쓸만한 툴이지만 수집된 결과를 분석하려면 전문적인 지식이 필요하다.

- Monkey : 클릭, 터치 등과 같이 사용자의 시스템 레벨 이벤트를 발생시켜 앱의 스트레스 테스트를 수행할 수 있는 툴이다.

- uiautomator : UI 자동화 테스트를 쉽게 수행할 수 있도록 도와주는 툴이다.

- ProGuard : 앱을 최적화하고, 사용하지 않은 클래스, 변수, 메서드를 제거하는 기능을 제공한다.

- zipalign : APK 파일의 크기를 효과적으로 줄여 주고, 압축되지 않은 이미지 및 원본 파일들을 최적화한다. 

- ARO : 배터리를 많이 사용하는 시점, 네트워크 데이터 등을 볼 수 있다. 자신이 만든 앱을 성능 개선을 위해 분석할 일이 있다면 ARO를 추천한다. 


※ 안드로이드는 이미지 처리만 잘해도 성능이 좋아진다.

: 안드로이드에서 이미지 최적화를 하지 않으면 화면을 아래로 스크롤 했을 때 사용자가 느끼기에 매우 버벅거리거나 느리다는 느낌을 받게 된다. 따라서 다음의 규칙을 따르면 성능이 더 좋아진다.

1. 이미지의 크기를 확인해라. 앱에서 사용자에게 보여지는 이미지는 엄청 작다. 이렇게 보여지는 이미지는 해상도가 좋을 필요가 없다. 그리므로 필요한 크기로 미리 서버에서 크기 조정 및 압축률을 변경하면 서버에서 안드로이드로 전달되는 파일의 크기도 작아지고 앱에서 처리하는 이미지의 크기도 작아 사용자가 느끼는 체감 속도는 빨라진다. 

2. ImageView의 setImageResource() 메서드 사용을 자제해라. setImageResource는 비트맵 이미지를 읽고 디코딩하는 작업을 UI 스레드에서 수행해서 응답 시간이 저하된다. 따라서 setImageDrawable이나 setImageBitmap을 사용하고 BitmapFactory를 사용하기를 권장한다. 추가로 ImageView 보다는 WebView를 사용할 경우 큰 효과를 볼 수 있다. 


+ Recent posts