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가 더 빠르다고 알 고 있었는데, 속은것 같다. 아니면 나의 실험이 잘 못된 것인가?
복사했습니다!