StringBuffer vs StringBuilder 성능 및 재사용

StringBuffer와 StringBuilder를 사용했을때 매객체생성과 기존 객체 재사용등의 방법으로 몇가지 돌려보고 시간을 뽑아 보았습니다.

결론부터 이야기하면 상황에 따라 다르긴 하지만 결론은

동기화가 필요한 경우 StringBuffer을 새로운 객체를 생성하는 것이 빠름.

동기화가 필요없는 경우 StringBuilder를 이용하여 setLength(0)을 이용하여 처리하는 것이 성능과 메모리 사용면에서 좋음.

테스트 코드

아래 기본 코드에서 StringBuffer와 StringBuilder를 테스트 하였음.

매 Loop에서 새로운 객체

        LocalTime startTime = LocalTime.now();

for(int i=0;i<100_000_000;i++){
StringBuffer sb = new StringBuffer();
for(int j=0;j<100;j++){
sb.append(j);
}
sb.toString();
}

LocalTime endtTime = LocalTime.now();
Duration duration = Duration.between(startTime, endtTime);
System.out.println(duration.getSeconds());

// StringBuffer : 107, j가 30일떄 : 34
// StringBuilder : 92, j가 30일떄 : 27

매 Loop에서 new StringBuffer(sb.length())

        LocalTime startTime = LocalTime.now();
StringBuffer sb = new StringBuffer();

for(int i=0;i<100_000_000;i++){
for(int j=0;j<100;j++){
sb.append(j);
}
sb.toString();
sb = new StringBuffer(sb.length());
}

LocalTime endtTime = LocalTime.now();
Duration duration = Duration.between(startTime, endtTime);
System.out.println(duration.getSeconds());
// StringBuffer : 104, j가 30일떄 : 35
// StringBuilder : 82, j가 30일떄 : 23
// sb = new StringBuilder(sb.capacity()); : 85, j가 30일떄 : 23

매 Loop에서 버퍼 사이즈 변경으로 인해 재사용 (sb.setLength(0);)

        LocalTime startTime = LocalTime.now();
StringBuffer sb = new StringBuffer();
for(int i=0;i<100_000_000;i++){
for(int j=0;j<100;j++){
sb.append(j);
}
sb.toString();
            sb.setLength(0);
}

LocalTime endtTime = LocalTime.now();
Duration duration = Duration.between(startTime, endtTime);
System.out.println(duration.getSeconds());
// StringBuffer : 264, J가 30일떄 : 75
// StringBuilder : 78, J가 30일떄 : 22

Posted by 다인,보리아빠
,