2007년 02월 02일
stringBuilder 사용법 - 닷넷기술
StringBuilder의 사용
많은 사람들이 알고 있는 것과 같이 string 타입의 연산에는 많은 오버해드가 발생한다.
string 타입의 연산을 하면 기존의 값이 바뀌는 것이 아니라 별도의 메모리를 새로 할당하고 새로 할당한 메모리에 연산의 결과를 넣고 있다. string 타입의 연산을 반복해서 사용할 경우에는 계속 메모리를 할당하고 복사하는 동작을 반복하면서 쓸데없는 부하를 일으킨다. 그래서 대부분의 경우 string 타입의 연산이 잦은 곳에는 string을 사용하지 말고 StringBuilder를 사용하라는 권장을 어디서나 쉽게 들을 수 있었을 것이다.
StringBuilder는 기본적으로 충분한 버퍼를 확보하고 계속 문자열을 추가(Append)하는 방식이기 때문에 기본적으로 문자열처럼 계속해서 메모리를 할당받지 않아도 된다. 때문에 보통 긴 문자열이나 SQL Query를 조합등에서 널리 사용하고 있는 방식이다.
StringBuilder를 사용하는 방법은 아주 쉽다. 먼저 기존의 string으로 구성된 예제를 보면 <리스트1>과 같다.
string a="aaa";
string b="bbb";
Console.WriteLine(a +b);
<리스트1>일반적인 string 연산의 예
<리스트1>을 StringBuilder를 사용하는 예제로 바꾸어 보면
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("aaa");
sb.Append("bbb");
Console.WriteLine(sb.ToString());
<리스트2>StringBuilder를 이용한 문자열 연산의 예
StringBuilder를 사용한다고 해서 무조건 성능에 도움이 되는 것은 아니다. StringBuilder의 경우 기본 버퍼 사이즈가 16Byte 밖에 되지 않기 때문이다. 만약 16Byte가 넘게 되면 StringBuilder가 알아서 32Byte로 다시 버퍼를 확장한다. 만약 32Byte 마저도 넘게 되면 다시 64Byte를 확보한다. StringBuilder는 초기 할당된 사이즈를 넘어서게 되면 계속해서 현재 메모리의 두 배의 메모리를 확보하게 된다. 이때 기존에 할당받은 메모리를 두 배로 늘리는게 아니라 두 배의 메모리를 새로 확보해서 새로 확보한 메모리로 string을 옮기는 방식으로 동작한다. 즉 할당받은 메모리가 넘치게 되면 string을 사용하는 거나 다름없다는 것이다. 이걸 피하기 위해서는
System.Text.StringBuilder sb = System.Text.StringBuilder(100);
처럼 처음에 StringBuilder를 생성할 때 생성자에 충분한 버퍼 사이즈를 지정해 주면 된다
많은 사람들이 알고 있는 것과 같이 string 타입의 연산에는 많은 오버해드가 발생한다.
string 타입의 연산을 하면 기존의 값이 바뀌는 것이 아니라 별도의 메모리를 새로 할당하고 새로 할당한 메모리에 연산의 결과를 넣고 있다. string 타입의 연산을 반복해서 사용할 경우에는 계속 메모리를 할당하고 복사하는 동작을 반복하면서 쓸데없는 부하를 일으킨다. 그래서 대부분의 경우 string 타입의 연산이 잦은 곳에는 string을 사용하지 말고 StringBuilder를 사용하라는 권장을 어디서나 쉽게 들을 수 있었을 것이다.
StringBuilder는 기본적으로 충분한 버퍼를 확보하고 계속 문자열을 추가(Append)하는 방식이기 때문에 기본적으로 문자열처럼 계속해서 메모리를 할당받지 않아도 된다. 때문에 보통 긴 문자열이나 SQL Query를 조합등에서 널리 사용하고 있는 방식이다.
StringBuilder를 사용하는 방법은 아주 쉽다. 먼저 기존의 string으로 구성된 예제를 보면 <리스트1>과 같다.
string a="aaa";
string b="bbb";
Console.WriteLine(a +b);
<리스트1>일반적인 string 연산의 예
<리스트1>을 StringBuilder를 사용하는 예제로 바꾸어 보면
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("aaa");
sb.Append("bbb");
Console.WriteLine(sb.ToString());
<리스트2>StringBuilder를 이용한 문자열 연산의 예
StringBuilder를 사용한다고 해서 무조건 성능에 도움이 되는 것은 아니다. StringBuilder의 경우 기본 버퍼 사이즈가 16Byte 밖에 되지 않기 때문이다. 만약 16Byte가 넘게 되면 StringBuilder가 알아서 32Byte로 다시 버퍼를 확장한다. 만약 32Byte 마저도 넘게 되면 다시 64Byte를 확보한다. StringBuilder는 초기 할당된 사이즈를 넘어서게 되면 계속해서 현재 메모리의 두 배의 메모리를 확보하게 된다. 이때 기존에 할당받은 메모리를 두 배로 늘리는게 아니라 두 배의 메모리를 새로 확보해서 새로 확보한 메모리로 string을 옮기는 방식으로 동작한다. 즉 할당받은 메모리가 넘치게 되면 string을 사용하는 거나 다름없다는 것이다. 이걸 피하기 위해서는
System.Text.StringBuilder sb = System.Text.StringBuilder(100);
처럼 처음에 StringBuilder를 생성할 때 생성자에 충분한 버퍼 사이즈를 지정해 주면 된다
# by | 2007/02/02 11:31 | study miscellaneous | 트랙백 | 덧글(0)







☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]