sitelink1 | |
---|---|
sitelink2 | |
sitelink3 | |
sitelink4 | |
sitelink5 | |
sitelink6 |
String과 StringBuffer 성능 차이
글: 최종명
String은 내용을 변경할 수 없기 때문에 String에서 + 연산자를 사용하면 내부적으로StringBuffer를 생성해서 append() 메소드를 이용해서 문자열을 결합한다는 것은 대부분의 자바 프로그래머가 알고 있을 것입니다.
따라서 String을 많이 사용하는 서블릿이나 기타 프로그램에서는 되도록이면 StringBuffer나 char[]를 사용하시는 것이 효과적이라는 것도 다 알고 있는 사실입니다. 그런데 프로그램하다보면 귀찮아서라도 String을 많이 사용하는 것이 현실입니다.
그래서 잠시 10여분을 할애하여 String과 StringBuffer의 성능 차이를 테스트 해보았습니다. 테스트는 제가 새로 얻은(?) 펜티엄에 윈도우 2000이 설치된 컴퓨터 에서 했습니다. 테스트할 프로그램은 다음과 같습니다. 각 프로그램은 모두 "a" 문자열을 30,000번 씩 결합하도록 했습니다.
예제 : StringTime.java
1 public class StringTime {
2
3 public static void main(String args[]) {
4 Runtime rt = Runtime.getRuntime();
5 System.out.print(rt.freeMemory());
6 System.out.println("/" + rt.totalMemory());
7 long start = System.currentTimeMillis();
8 String a = "a";
9 for(int i=0; i < 30000; i++) {
10 a += "a";
11 }
12 long stop = System.currentTimeMillis();
13 System.out.println(stop - start);
14 System.out.print(rt.freeMemory());
15 System.out.println("/" + rt.totalMemory());
16 }
17
18 }
예제 : StringBuffer.java
1 public class StringBufferTime {
2
3 public static void main(String args[]) {
4 Runtime rt = Runtime.getRuntime();
5 System.out.print(rt.freeMemory());
6 System.out.println("/" + rt.totalMemory());
7 long start = System.currentTimeMillis();
8 StringBuffer a = new StringBuffer("a");
9 for(int i=0; i < 30000; i++) {
10 a.append("a");
11 }
12 long stop = System.currentTimeMillis();
13 System.out.println(stop - start);
14 System.out.print(rt.freeMemory());
15 System.out.println("/" + rt.totalMemory());
16 }
17
18 }
테스트 결과
String
1830448/2031616
41800 -> 총 소요시간(단위: ms)
967576/2031616
StringBuffer
1830336/2031616
30 -> 총 소요시간(단위: ms)
1673200/2031616
시간 차이도 많이 났지만, 메모리 사용량도 상당한 차이가 있었습니다. 이와 함께 더 큰 문제는 이 작업이 많아질 수로 가비지 콜렉션에 의해 String을 사용하는 경우에 시간에 휠씬 큰 차이로 많이 소요된다는 것입니다.
String클래스와 StringBuffer클래스의 차이점
* String은 문자열의 내용이 조금이라도 바뀌거나 스트링 컨케트네이션되면 새로운
객체를 만든다.
레퍼런스를 잃어버린 객체는 가비지 컬렉션의 대상이 되며 새로운 객체에 새 주소를
주므로 해쉬코드도 변한다. Immutable한 특징도 가지고 있다.
* StringBuffer는 원래 있던 객체의 내용만 바뀌는 Mutable한 특징이 있다.
Mutable : 변덕스러운.
Immutable : 불변의.
StringBuffer 안의 모든 문자열을 지우고 싶을때
StringBuffer sb = new StringBuffer();
sb.append("안녕하세요.abc");
sb.delete(0, sb.length());