Published 2023. 4. 26. 10:58
728x90
java 무엇이 제일 빠른가? StringBuilder vs StringBuffer vs concat vs plus(+)
아래와 같이 퍼포먼스 테스트를 진행해 보았다.
- 500_000번 for 문을 돈다
- 내가 알고 있던 지식과 상반된 결과를 보였다
- 모든 블로그와 책들은 거짓말을 하는걸까?
결론 요약
- 퍼포먼스 테스트 결과
- 제가 잘 못 알고 있었네요! concat이 제일 느리네요!
- StringBuffer -> String Builder -> +연산 -> concat
수행코드
public class StringConcatTest {
private final Long MAX_VALUE = 500_000L;
@Test
public void 스트링빌더에_대한_퍼포먼스를_테스트() {
StringBuilder sb = new StringBuilder();
StopWatch stopWatch = new StopWatch();
stopWatch.start();
for (int i = 0; i < MAX_VALUE; i++) {
sb.append("a");
}
stopWatch.stop();
System.out.println("StringBuilder: " + stopWatch.getLastTaskTimeMillis());
}
@Test
public void 스트링버퍼에_대한_퍼포먼스를_테스트() {
StringBuffer sb = new StringBuffer();
StopWatch stopWatch = new StopWatch();
stopWatch.start();
for (int i = 0; i < MAX_VALUE; i++) {
sb.append("a");
}
stopWatch.stop();
System.out.println("StringBuffer: " + stopWatch.getLastTaskTimeMillis());
}
@Test
public void 더하기연산에_대한_퍼포먼스를_테스트() {
String concat = "";
StopWatch stopWatch = new StopWatch();
stopWatch.start();
for (int i = 0; i < MAX_VALUE; i++) {
concat = concat + "a";
}
stopWatch.stop();
System.out.println("plus(+): " + stopWatch.getLastTaskTimeMillis());
}
@Test
public void 콘켓_연산에_대한_더하기_테스트() {
String concatString = "";
StopWatch stopWatch = new StopWatch();
stopWatch.start();
for (int i = 0; i < MAX_VALUE; i++) {
concatString = concatString.concat("a");
}
stopWatch.stop();
System.out.println("concat: " + stopWatch.getLastTaskTimeMillis());
}
}
실제 결과
StringBuilder: 18
concat: 13469
StringBuffer: 11
plus(+): 11624
궁금증
- StringBuffer는 스레드 세이프 해서 더 느려야 한다, 근데 더 빠르다!
- 1.5배정도 빠른것 같다.
앞으로 난 StringBuffer를 사용할 예정이다.
- Thread safe하기도 하고 속도도 내가 알고 있던것 보다 빠르다!!
- StringBuilder가 더 빠르다고 알 고 있었는데, 속은것 같다. 아니면 나의 실험이 잘 못된 것인가?
LIST
'Java' 카테고리의 다른 글
java ZoneId.getAvailableZoneIds() 전체 타임존 리스트 확인하기 TimeZone Asia/Seoul (0) | 2024.03.08 |
---|---|
[Java] Google OTP 개발기 - 구글OTP 쉬워요! (0) | 2023.07.06 |