String
final String aValue = "abcde"
for(int i = 0; i < 10; i++) {
String a = new String();
StringBuffer b = new StringBuffer();
StringBuilder c = new StringBuilder();
for(int k = 0; k < 10000; k++) {
a += aValue;
}
for(int k = 0; k < 10000; k++) {
b.append(aValue);
}
for(int k = 0; k < 10000; k++) {
c.append(aValue);
}
}
- 위와 같이 테스트를 진행할 때 아래와 같이 시간이 소요가 됩니다.
a | 95초 |
b | 0.24초 |
c | 0.17초 |
String
abcde | abcde | ||
abcde | abcde | abcde |
- 위와 같이 새로운 객체가 계속 생성되면서 이전 객체를 쓰레기로 만듭니다.
- 많은 GC를 하게 하여 시간이 많이 소요됩니다.
StringBuffer, StringBuilder
abcde | abcde | abcde |
- 위와 같이 새로운 객체를 생성하지 않고 기존에 있는 객체의 크기를 증가시키면서 값을 더하기 때문에
시간이 조금 소요됩니다.
Charsequence
- 인터페이스
- 구현 객체로 CharBuffer, String, StringBuffer, StringBuilder가 있음
- StringBuffer나 StringBuilder로 생성한 객체를 전달할 때 사용
- 굳이 이걸로 toString을 수행하고 객체를 넘겨주기 보다 CharSequence로 받아 넘기는 것이
메모리 효율에 좋음
- 굳이 이걸로 toString을 수행하고 객체를 넘겨주기 보다 CharSequence로 받아 넘기는 것이
StringBuilder sb = new StringBuilder();
check(sb)
public void check(CharSequence cs) {
StringBuffer sb = new StringBuffer(cs)
sb.toString()
}
For
for(int i = 0; i < list.size(); i++)
- 위와 같이 for문을 사용하게 되면 list.size()만큼 list.size()를 매번 반복하면서 메소드를 호출하게 됩니다.
int size = list.size();
for(int i = 0; i < size; i++)
- 따라서 위와 같이 분리하여 성능을 최적화 시켜야 합니다.
private static long sum() {
Long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++) {
sum += i;
}
return sum;
}
- 위와 같은 상황에서는 만약 오타일 경우 대문자 오타 하나로 아니면 개념을 이해하지 못해 아무거나 가져다 쓰게 되면 for문에서 Long 객체가 2^31개 만큼 만들어지게 됩니다.
- long으로 정정해주게 되면 6.3초에서 0.59초로 빠르게 만들 정도로 성능을 올릴 수 있습니다.
'개발서적 > 자바 성능 튜닝 이야기' 카테고리의 다른 글
[자성튜이] 로그 작성 (0) | 2024.09.16 |
---|---|
[자성튜이] IO 이야이야기 (0) | 2024.08.25 |
[자성튜이] static에 관하여 / reflection (0) | 2024.08.22 |
[자성튜이] 속도 측정 (0) | 2024.08.22 |
[자성튜이] J2EE 디자인 패턴 (0) | 2024.08.22 |