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을 사용하세요.








