SummaryBook/[자바 성능 튜닝 이야기]
String과 StringBuffer, StringBuilder
seung_soos
2023. 12. 20. 23:01
시작하며
자바 성능 튜닝 이야기 [Chap 3] <왜 자꾸 String을 쓰지 말라는거야>를 읽고 정리 및 추가 개념을 정리하였다.
String vs StringBuffer vs StringBuilder
// 책참고 코드
final String aValue = "abcde";
for(int outLoop=0;outLoop<10;outLoop++) {
String a = new String();
StringBuffer b = new StringBuffer();
StringBuilder c = new StringBuilder();
for(int loop=0;loop<10000;loop++) {
a+=aValue;
}
for(int loop=0;loop<10000;loop++) {
b.append(aValue);
}
String temp = b.toString();
for(int loop=0;loop<10000;loop++) {
c.append(aValue);
}
String temp2 = c.toString();
}
- 응답시간
주요 소스 부분 | 응답 시간(ms) | 비고 |
a+=aValue; | 95,801.41ms | 95초 |
b.append(aValue); String temp=b.toString(); |
247.48ms 14.21ms |
0.24초 |
c.append(aValue); String temp2=b.toString(); |
174.17ms 13.38ms |
0.17초 |
- 메모리사용량
주요 소스 부분 | 메모리 사용량(bytes) | 생성된 임시 객체 수 | 비고 |
a+=aValue; | 100,102,000,000 | 4,000,000 | 약 95Gb |
b.append(aValue); String temp=b.toString |
29,493,600 10,004,000 1,200 |
200 | 약 28Mb 약 9.5Mb |
c.append(aValue); String temp2=b.toString() |
29,493,600 10,004,000 |
1,200 200 |
약 28Mb 약 9.5Mb |
a += avalue; => a=a+aValue와 같다.
새로운 String 객체가 만들어지고, 이전에 있던객체는 GC의 대상이된다.
StringBuffer 클래스와 StringBuilder 클래스
StringBuffer, StringBuilder 클래스는 제공하는 메서드가 동일하다.
StringBuffer 클래스는 스레드에 안전하게(Thead Safe)설계 되어 있으므로, 여러개의 스레드에서 하나의 StringBuffer 객체를 처리해도 전혀 문제가 되지 않는다. 하지만, StringBuilder는 단일 스레드에서의 안정성만을 보장한다. 그렇기 때문에 여러개의 스레드에서 하나의 StringBuilder 객체를 처리하면 문제가 발생한다.
왼쪽이 StringBuffer의 append 메서드이며, synchronized가 선언되어있고, 오른쪽의 StringBuilder는 없다.