제 폰은 갤럭시S2(KT)인데 초기 진저브래드에서 ICS를 거쳐 현재는 젤리빈(4.1.2)까지 업그레이드해서 사용중입니다.
그리고 텍스트파일 내용을 보는 앱을 만들어 사용 중인데 단순히 텍스트파일 내용을 TextView에 setText()해서 본다고 생각하시면 될 것 같습니다.
이 앱이 예전 진저브래드에서는 화면에 파일 내용이 표시되는 시간이 빨랐습니다.
그런데 ICS로 업그레이드 되면서 갑자기 진저때보다 엄청 느려졌습니다.
그리고 젤리빈으로 업그레이드 될때는 ICS보다 비슷 아니면 약간 더 느려진것 같습니다.
그래서 원인을 분석해봤는데요.
TextView에 setText()를 하게되면 WordWrap 처리를 위해 Paint.getTextWidths()를 사용해서 각 글자의 width를 구한 후 TextView의 width를 넘기지 않게 어디서 글자를 꺽어야 하는지를 계산하게 됩니다.
문제는 여기서 사용되는 Paint.getTextWidths()가 ICS부터 엄청 오래 걸립니다.
인터넷 찾아보니 안드로이드가 ICS부터 그래픽 관련 네이티브 라이브러리를 바꿨다고 하던데 이것 때문에 느려진게 아닌가 싶은데요.
테스트 코드를 만들어 시간을 체크해봤습니다.
화면의 TextView에 paint.getTextWidths()의 수행시간을 출력하는 코드입니다.
-------------------------
final TextView tv = (TextView)findViewById(R.id.tv);
tv.post(new Runnable() {
public void run() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1024 * 1024; i++) {
sb.append("가");
}
TextPaint paint = tv.getPaint();
float[] widths = new float[sb.length()];
long s = System.currentTimeMillis();
paint.getTextWidths(sb.toString(), widths);
tv.setText(String.format("%,d ms", System.currentTimeMillis() - s));
}
});
-------------------------
애뮬레이터에서 안드로이드 버전별로 테스트한 결과인데 아래와 같습니다.
-------------------------
Android 2.2 : 905 ms
Android 2.3.3 : 1,042 ms
Android 4.0.3 : 10,853 ms
Android 4.1.2 : 19,913 ms
Android 4.2 : 20,603 ms
-------------------------
이건 애뮬레이터 결과라 안드로이드 버전별 기기별 테스트를 해보고 싶은데 전 갤2밖에 없네요.
지금까지 확인한건 알파벳, 숫자는 버전별로 별 차이가 없는데 한글이 특히 심하고, 폰트와도 관련이 있는것 같은데 기본폰트보다 나눔고딕으로 하면 젤리빈에서 30 ~ 40%정도 빠릅니다.
암튼 저는 안드로이드가 ICS부터 Paint.getTextWidths()의 네이티브 코드가 성능에 문제가 있다고 생각합니다.
혹시 종류별로 기기를 보유하신 분이 있다면 다양하게 테스트 부탁드립니다.
제 폰의 결과입니다.
SHW-M250K v4.1.2
기본폰트 : 약 2,330 ms
나눔고딕 : 약 660 ms
긴 글 읽어주셔서 감사합니다.