코딩하기/Android

Debugging(2) - 안드로이드 함수 수행 시간 체크

알랭드1종보통 2021. 4. 7. 15:21
반응형

안녕하세요

지난번 Debugging(1) 글에 이어 두번째 글입니다

Debugging(1) - 콜스택을 이용한 디버깅(부제: 누가 내 치즈를 옮겼을까?)

디버깅을 하는 이유중 오류를 잡기 위해서도 있지만 다른 하나로 내가 만든 로직이 얼마만큼의 성능을 내고 있는지

확인이 필요할 때가 있습니다.

성능을 확인하는 방법은 여러가지가 있을겁니다,

배터리를 얼마큼 소모하는지 측정하거나, 얼마나 빠르게 로직이 수행되는지, 불필요한 로직이 있는가

이중 로직 처리 시간을 체크하는 기본적인 방법에 대해서 확인해보겠습니다

한개의 함수안에서 체크하는 경우에는 간단히 다음과 같이 확인해볼수 있습니다

void A(boolean callB) {
        long startTime = System.currentTimeMillis();
        if (callB) {
            B();
        } else {
            D();
        }
        Log.v("DEBUG", "Duration : " + (System.currentTimeMillis() - startTime));
    }

위와 같이 한 함수안에서는 다음과 같이 간단하게 얼마나 걸리는지 측정할 수 있을겁니다

그렇다면 2개의 함수간 걸리는 시간을 측정할때나 다른 클래스 사이에서는 시간을 측정할때는 위 측정방법을 다음처럼 변형해서 사용할 수도 있습니다.

    private static final Map<String, Long> mCheckDurationMap = new HashMap<>();

    public static void checkDuration(String title, String extraInfo, boolean start) {
        long currentTime = System.currentTimeMillis();
        if (!start) {
            if (mCheckDurationMap.get(title) != null) {
                if (extraInfo == null) {
                    Log.d("DEBUG", "Duration (" + title + ") : " + (currentTime - mCheckDurationMap.get(title)));
                } else {
                    Log.d("DEBUG", "Duration (" + title + ") , (" + extraInfo + ") : " + (currentTime - mCheckDurationMap.get(title)));
                }
            }
        }
        mCheckDurationMap.put(title, currentTime);
    }

 

 사용예시

    void A(boolean callB) {
        checkDuration("checkA", null, true);
        checkDuration("checkMethodTime", null, true);
        if (callB) {
            B();
        } else {
            D();
        }
        checkDuration("checkMethodTime", null, false);
        checkDuration("checkA", null, false);
    }

    void B() {
        C("1");
        checkDuration("checkMethodTime", "B", false);
    }

    void D() {
        try {
            sleep(100);
        } catch (InterruptedException e) {
            Log.e("DEBUG", "error " + e.toString());
        }
        checkDuration("checkMethodTime", "D", false);
    }

결과

D/DEBUG: Duration (checkMethodTime) , (D) : 102
D/DEBUG: Duration (checkMethodTime) : 0
D/DEBUG: Duration (checkA) : 103

사용예시에서는 두가지 방식으로 측정해보았습니다

checkA 함수가 끝나는 시간과, 구간별 함수 처리에 걸리는 시간(A함수와 D함수에서도 같은 key를 이용해서 구간별로 시간체크)

위처럼 함수하나를 자신만의 스타일로 만들어놓고 사용하면 코딩시간을 줄이면서 디버깅을 해볼수 있을거 같습니다

감사합니다

반응형