티스토리 뷰

반응형

Java 프로그램 연산 속도 계산하기

연산속도를 계산하기 위해서는 System.currentTimeMillis()나 System.nanoTime()을 이용합니다. 두 메소드는 UTC라는 시간 표준 체계를 따라 현재시간을 리턴해줍니다. 그래서 연산 속도를 측정하기 위해서 시작시간의 현재시간, 종료시간의 현재시간의 차를 이용하면 연산속도가 얼마인지 계산 해 낼 수 있습니다. currentTimeMillis는 ms로리턴하고(1/1,000초) JDK 5버젼 이상부터는 사용가능한 nanoTime는 ns(1,000,000,000초)로 리턴하니 가능하면 더 정확한 nanoTime을 사용하는게 좋습니다.


String vs StringBuffer 연산 속도 비교해보기

String

String을 이용하여서 "abcde"라는 문자열을 10,000번 더하는 연산을, 10번 동안 반복하는 예제입니다.

public class CompareTimer {
    public static void main(String[] args) {
        String str = "";
        for (int i = 0; i < 10; i++) {
            //시작시간
            long startTime = System.nanoTime();

            for (int j = 0; j < 10000; j++) {
                str += "abcde";
            }

            //종료시간
            long endTime = System.nanoTime();

            //종료시간 - 시작시간은 = 걸린 시간
            Double elapsedTime = (endTime - startTime) / 1000000.0;
            System.out.println(elapsedTime);
        }
    }
}
출력결과
466.916963
1099.798544
1224.311061
1716.985322
2408.916748
2991.159532
3567.40275
4406.573175
5717.342793
4499.840759

String은 불변객체이기 때문에 문자열을 더하게 되면, 기존의 String 객체를 이용하는 것이 아니라 더 해진 별개의 문자열을 생성하게 됩니다.

StringBuffer

StringBuffer를 이용하여서 위와 비슷한 연산을 하는 예제입니다. 문자열을 더 할때는 append() 메소드를 사용합니다.

public class CompareTimer {
    public static void main(String[] args) {
        String str = "";
        for (int i = 0; i < 10; i++) {
            //시작시간
            long startTime = System.nanoTime();

            for (int j = 0; j < 10000; j++) {
                str += "abcde";
            }

            //종료시간
            long endTime = System.nanoTime();

            //종료시간 - 시작시간은 = 걸린 시간
            Double elapsedTime = (endTime - startTime) / 1000000.0;
            System.out.println(elapsedTime);
        }
    }
}
출력결과
2.998412 //첫번째 결과는 무시해야 합니다.
1.168816
1.406275
0.603506
0.399662
0.925115
0.572798
0.593879
0.42632
0.309579

StringBuffer는 문자열을 여러번 더하더라도 하나의 객체를 이용하므로 String보다 훨씬 빠르게 진행됩니다. 비슷한 클래스로 StringBuilder가 있습니다. StringBuilder가 아주 조금 더 빠르긴 하지만 StringBuffer는 스레드에 안전하기 때문에 먼저 StringBuffer를 고려 해보고, 쓰레드 여부와 상관 없는 프로그램의 경우 StringBuilder를 사용합니다.



이 포스팅은 '자바 성능 튜닝 이야기 (이상민 저자)'를 참고하여 작성한 포스팅입니다.

반응형
댓글