성능을 생각한다면 String 대신 StringBuilder
문자열 연결 연산자(+)는 편리하지만, 성능 위주의 환경에서는 성능 저하를 감내하기 어려울 것이다.
문자열 연결 연산자로 문자열 n개를 잇는 시간은 n^2에 비례한다. 문자열은 불변이라서 두 문자열을 연결할 경우
양쪽의 내용을 모두 복사해야 하므로 성능 저하는 피할 수 없다.
public String statement() {
// 문자열 연결을 잘못 사용한 예 - 느리다!
String result = "";
for (int i = 0; i < numItems(); i++) {
result += lineForItem(i); // 문자열 연결
}
return result;
}
성능을 포기하고 싶지 않다면 StringBuilder를 사용하자
public String statement2() {
StringBuilder b = new StringBuilder(numItems() * LINE_WIDTH);
for (int i = 0; i < numItems(); i++) {
b.append(lineForItem(i));
}
return b.toString();
}
자바 6 이후 문자열 연결 성능을 다방면으로 개선했지만, 여전히 성능 차이는 크다.
품목을 100개로 하고 lineForItem이 길이 80인 문자열을 반환하게 하여 수행해보면 statement2가 훨씬 빠른걸 볼 수 있다.
참고로 statement2에서 전체 결과를 담기에 충분한 크기로 초기화 한점을 잊지 말자. 허나 기본값을 사용하더라도 훨씬 빠르다.
출처:effective java item63
'Java' 카테고리의 다른 글
객체는 인터페이스를 사용해 참조하자 (0) | 2021.02.10 |
---|---|
메서드 시그니처를 신중히 설계하라. (0) | 2021.02.09 |
박싱 타입보다 기본 타입을 사용하라 (0) | 2021.02.01 |
정확한 계산이 필요할 땐 float와 double은 피하자 (0) | 2021.01.18 |
지역변수의 범위는 최소화하자 (0) | 2021.01.05 |