Regular Motion

개발자가 상팔자

Java에서 효율적인 문자열 덧셈!

Java에서 2개의 문자열을 더하기 위해 많이 사용하는 방법에는 약 4가지가 있다.

그리고 각각의 방법은 결과는 동일하지만 내부 처리과정이 다르고,

반복해서 사용할 경우 상황에 따라 100배 이상의 성능차이가 발생한다.

그럼 각각의 방법을 살펴보자.

 

1. s1 = s1 + s2;

이 방법은 가장 직관적이고 사용하기 쉬운 장점이 있는 반면,

Java에서 String의 immutable(불변)한 속성때문에 s1 + s2의 연산 결과를

저장하기 위해 새로운 String 객체를 생성하고 이 과정에는

메모리 할당과 같은 추가적인 비용 + Garbage가 생성된다는 큰 단점이 있습니다.

실제로 수행 속도가 가장 느리고, 테스트에 사용된 문자열의 길이가

늘어남에 따라 가장 민감하게 시간이 증가하였습니다.

s1과 s2의 길이가 5일 때 평균 350ms가 소요되었고, 20일 때, 3000ms이 소요되었습니다.

 

2. s3 = s1.concat(s2);

1번과 비슷한 특징을 갖고 있고, 테스트에 사용된 문자열의 길이가 짧을 때는  1번보다 느리게 측정되었습니다. (Java 6 기준)

s1과 s2의 길이가 5일 때 평균 480ms가 소요되었고, 20일 때,  2800ms가 소요되었습니다.

 

3. StringBuffer의 append();

추가로 객체를 생성해야 한다는 단점이 있는 반면, 문자열을 더해야되는 횟수가 늘어날수록,

문자열의 길이가 길수록 월등한 성능을 보여주었습니다.

s1과 s2의 길이에 크게 상관없이 10ms 이하가 소요되었습니다.

 

4. StringBuilder의 append();

개인적으로 테스트한 결과에서는 StringBuffer와 별 차이를 보여주지 못했지만,

StringBuilder가 Brand New한 Class고 반복횟수와 문자열의 길이가 늘어날수록

더나은 성능을 보여준다고 한다!  (참고 : http://kaioa.com/node/59)

 

 

{ Reference }

http://kaioa.com/node/59

2 Comments

  1. 전자의 코드가 느린 이유는 Java에서 String의 Immutable한 속성때문에 String 덧셈의 결과를 저장하기 위해 계속 새로운 String 객체를 생성하게 되는데 이 과정에는 메모리 할당 @ 등의 작업이 추가되기 때문입니다. GC를 유발하는 등의 단점은 덤입니다.

  2. REGULARMOTION

    2012년 8월 1일 at 5:13 오후

    예 언급해주신 부분을 수정한 뒤 테스트하면 더 정확한 테스트가 될 것 같습니다. ^^

답글 남기기

© 2017 Regular Motion

Theme by Anders NorenUp ↑