StringBuffer VS String

항상 이논쟁은 있어왔다. 계속해서 문자열을 이어붙여 나가는 작업이 필요할 경우 StringBuffer와 String중에 누가 더 빠르냐는 논쟁이었다.

당연히 StringBuffer가 빠르다는것이 대부분의 생각이지만 String이 오히려 더 빠르다는 의견도 있어왔다.

개인적으로 내가 사용하는 방식일때 퍼포먼스가 어떻게 될지 궁금해 졌다. 또는 붙어 나가는 글자수에 따라 또 다르지 않을까 하는 생각에 테스트를 해보게 되었다.

글자가 10개씩 붙을때와, 1000개씩 붙을때의 경우의 수에 따라 100개, 1,000개, 10,000개, 20,000개, 30,000개를 테스트 해보았다. 오차범위를 줄이기 위해 100번씩 돌렸다. 1000번 돌릴껄 그랬나?;;

테스트 코드는 다음과 같다.

StringBuffer :

public class StringBufferTest {

 public static void main ( String[] args ) {

  StringBuffer sb = new StringBuffer();

  long sTime = System.currentTimeMillis();

  for ( int i = 0 ; i < MAX_LOOP ; i++ ) {
   sb.append("DUMMY TEXT");
  }

  System.out.println("Elapsed Time : " + (System.currentTimeMillis()-sTime));
 }
}

String :

public class StringTest {

 public static void main ( String[] args ) {

  String str = "";

  long sTime = System.currentTimeMillis();

  for ( int i = 0 ; i < MAX_LOOP ; i++ ) {
   str += "DUMMY TEXT";
  }

  System.out.println("Elapsed Time : " + (System.currentTimeMillis()-sTime));
 }
}

결과는 다음과 같다.

사용자 삽입 이미지


글자가 10자리일때 : String의 경우 속도가 기하급수적으로 늘어나나 StringBuffer는 거의 속도변화가 없다.

사용자 삽입 이미지


글자가 1,000자리일때 : String의 경우 기하급수적으로 늘더니 10,000개부터는 아예 응답이 없다.
StringBuffer의 경우 20,000개부터는 메모리 힙영역이 부족하다는 에러메시지를 내뱉어버린다.

 

결론 : 저런 큰 작업은 그냥 복잡하게 생각하지 말고 StringBuffer를 쓰자. 하지만 보시다시피 1,000개 이상씩 수많은 작업을 할것이 아니라면 그것도 별 차이가 없다. 고로 무엇을 어떻게 쓰던 그다지 상관이 없다는것.