본문 바로가기
안드로이드

[안드로이드] Runnable 생성&호출 성능 비교

by 호군 2011. 9. 7.
반응형
Thread에서 TextView의 Text를 1초에 5번 정도 업데이트를 하려고 합니다.
안드로이드에서는 MainThread에서만이 UI 업데이트를 할 수 있기 때문에
Handler를 이용하여 Text를 업데이트를 시도했습니다.

이때 드는 궁금증...(?)
과연 Handler에 Runnable을 계속 생성 해주는 것과 한번만 생성해 줄 때 성능 차이가 날까? 생각이 들었습니다.
코드로 보자면 아래와 같습니다.
Case1. Runnable를 계속 생성해주는 경우
Thread thread = new Thread(new Runnable() {
    public void run() {
        handler.post(new Runnable() {
            public void run() {
                hello.setText("test");
            }
        }); 
    }
}
thread.start();

Case2. Runnable을 한번만 생성하는 경우
final Runnable mRunnable = new Runnable() {
    public void run() {
        hello.setText("test");
    }
}
Thread thread = new Thread(new Runnable() {
    public void run() {
        handler.post(mRunnable); 
    }
}
thread.start();

이 두 경우는 어느것이 더 빠를까요?? 저는 당연히 한번 생성할 경우가 어떤 차이든 빠를 것이라고 생각했습니다.
for문으로 100,000번의 반복하여 테스트를 해보니 결과는 생각과는 달랐습니다.
Case1. Runnable을 100,000번 생성하여 나온 결과
Start time : 1315379066054ms, Middle time : 1315379066055ms, interval : 1ms
Start time : 1315379066054ms, Middle time : 1315379139901ms, interval : 73847ms
Start time : 1315379066054ms,     End time : 1315379212201ms, interval : 146147ms

Case2. Runnable을 한번 생성하여 나온 결과
Start time : 1315378816920ms, Middle time : 1315378816920ms, interval : 0ms
Start time : 1315378816920ms, Middle time : 1315378890932ms, interval : 74012ms
Start time : 1315378816920ms,     End time : 1315378964231ms, interval : 147311ms

결과를 보시면 Case1이 더 시간이 빠른 것을 알 수 있습니다. 총 걸린 시간은 146초와 147초...
2분 30초 동안 for문으로 100,000번을 수행한거죠. 그런데도 차이는 거의 없었습니다.
그리고 테스트는 애뮬레이터에서 하다보니 수행시간이 더 느렸겠구요.
어째든 Runnable을 매번 생성하는 것이 성능에 영향을 주지 않는 것 같다는 느낌을 받았습니다.



  아직도 드는 의문(?)

Java Effective를 보면 String 조차 new로 생성하면 그렇지 않을 때보다 수행 속도가 많이
느려진다고 합니다.
그런데 왜 Runnable은 차이가 없는 것 일까요? 컴파일시 똑똑하게 처리를 해주는 것인지...
아니면 반복횟수가 적었던것인지.. 그것도 아니라면 post는 바로 처리하는게 아니라 queue에
넣어주어 처리하기 때문에 화면에 MainThread가 꺼내서 화면에 처리하는 것이 Runnable을 생성하는 것보다 느려서 발생되는 것인지 궁금증이 생기네요.





반응형