본문 바로가기

프로그래밍관련/java

(뻘짓)문자열 생성에 대한 String, String.format, StringBuffer를 이용한 시간비용


문자열을 생성할때 조합되는 문자열은 가능한 StringBuffer를 사용하는 것이 좋다고 오윤석 과장님의 말씀을 들은 뒤 별 생각없이, StringBuffer만 사용했었는데...
문득 파견나와 String.format() 으로 중간중간 치환해놓은 조합문자열을 대부분의 소스에 사용되어있는 소스를 보니, 간단하게 테스트하고 싶어졌네요.
String.fomat()은 나름대로 유용한 기능은 맞지만, 형변환이 발생하고 위치를 찾는 소요도 있기때문에 비용발생이 높겠지..라고 생각했는데요.
기존 클라이언트 소스이다보니 마음대로 수정하기 뭐해서 간단하게 비용측정을 해보았습니다.
나름의 근거? ㅡ..ㅡ;;

결과는 역시나...
[
String : 35
String.format : 616
StringBuffer : 36
]

String 기본객체가 빨라보이지만, 특성상 메모리주소는 변경횟수, 조합수에 따라 증가되므로...
메모리 효율은 비효율적이 되겠죠.
String.format은 조합하는 과정에 발생되는 메모리 주소는 어떻게 되는지 모르겠네요 ㅡ0ㅡ;
결론은 특별히 치환할 이유가 없는 경우...
StringBuffer가 좋겠네요. ㅎㅎ

아래는 간단한 샘플입니다. ^^;

        int i = 0;
        long prev_time = System.currentTimeMillis();
        long time;
        for( i = 0; i< 100000; i++){
            String s = "Blah" + i + "Blah";
        }
        time = System.currentTimeMillis() - prev_time;
        System.out.println("String : " + time);
        prev_time = System.currentTimeMillis();
        for( i = 0; i<100000; i++){
            String s = String.format("Blah %d Blah", i);
        }
        time = System.currentTimeMillis() - prev_time;
        System.out.println("String.format : " + time);
        prev_time = System.currentTimeMillis();
        for( i = 0; i<100000; i++){
            StringBuffer s = new StringBuffer();
            s.append("Blah");
            s.append(i);
            s.append("Blah");
        }
        time = System.currentTimeMillis() - prev_time;
        System.out.println("StringBuffer : " + time);