<< Top 125 Blogs for Development Managers | | Javascript기반의 Pagination >>

Java 5에서 String Concatenation과 StringBuffer의 속도 비교

JDK 1.4에서와 JDK 1.5에서 문자열을 결합할 경우 똑같은 상황이 올까요? ^^

1. 예제 소스

package client;
public class StringTest
{
    public interface Repeatable {
        void iteration(long loopId);
    }
    public static long repeat(int times, Repeatable repeatable) {
        long initial = System.currentTimeMillis();
        for (long c = 1; c <= times; c++)
            repeatable.iteration(c);
        long elapsed = System.currentTimeMillis() - initial;
        return elapsed;
    }
    private static Repeatable stringBufferTest = new Repeatable()
    {
        public void iteration(long loopId) {
         String alias = "a";
         StringBuffer query = new StringBuffer(300);
         query.append("SELECT ");
            query.append(alias).append(".userName, ");
            query.append(alias).append(".registerDate, ");
            query.append("sum(").append(alias).append(".duration), ");
            query.append(alias).append(".id FROM ");
            query.append(StringTest.class.getName())
.append(" as ").append(alias);
            query.append(" ORDER BY ")
.append(alias).append(".registerDate desc ");
            String result = query.toString();
        }
    };
    private static Repeatable stringConcatenationTest = new Repeatable()
    {
        public void iteration(long loopId) {
            String query =
                "SELECT " +
                    "a.userName, " +
                    "a.registerDate, " +
                    "sum(a.duration), " +
                    "a.id " +
                "FROM " +
                 StringTest.class.getName() +
                    " as a " + "ORDER BY " +
                    "a.registerDate desc";
            String result = query;
        }
    };
    public static void main(String[] args) {
        int times = 1000000;
        long stringBuffElapsed, stringConcatElapsed;
       
        for (int loopCount = 1; loopCount <= 5; loopCount++)
        {
            stringBuffElapsed = repeat(times, stringBufferTest);
            stringConcatElapsed = repeat(times, stringConcatenationTest);
            System.out.println("반복 횟수 " + loopCount);
            System.out.println("StringBuffer 처리 시간 : " + stringBuffElapsed);
            System.out.println("String  Concatenation 처리 시간 : " +
stringConcatElapsed + "\n");
        }
    }
}

2. 예제 결과


3. 의견
 - String객체는 immutable, StringBuffer는 mutable
 - Stringr constant expression... 컴파일시에 결정되어, StringBuffer non-constant expression..런타임에 결정된다.

 위의 String Concatenation이 StringBuffer보다 두배이상 빠르게 나오네요. 변수의 값이 런타임에 결정되는 것일 경우 StringBuffer, 아닐 경우는 String Concatenation을 사용하세요.




코멘트 달기 Send a TrackBack