본문 바로가기
Programming/C#

StringBuilder Capacity

by 유주원 2013. 8. 12.

String 연산 시 StringBuilder의 사용이 더 효용적이라는 것은 개발자들 사이에선 이미 진리로 자리잡았다.


그럼 StringBuilder는 어떻게 사용해야 되는 것일까?

대부분 아래와 같이 StringBuilder 객체 생성 후 Append 하여 사용하는 경우가 많을 것이다.

StringBuilder sb = new StringBuilder();

for(int i = 0; i < 10; i++){

sb.Append(str[i]);

}


하지만 위와 같은 방식은 그리 좋지 못하다. 기본적으로 StringBuilder 객체 생성 시 내부적으로 16 bytes의 버퍼 크기를 가진다. 

만약 Append 시 16 bytes 이상의 문자열이 입력으로 들어왔다면, StringBuilder 내부에서는 버퍼를 추가로 할당 받아야 하며, 이런 상황이 되풀이 된다면 속도 측면에서 큰 만족을 얻지 못할 것이다.

StringBuilder 초기 생성시에는 명시적으로 버퍼 용량을 지정해 주는 것이 바람직하다.

StringBuilder sb = new StringBuilder(4096);


그럼 초기 버퍼는 얼마나 줘야 할까??

답은 적당히.. 알아서 이다.

초기 버퍼의 크기는 개발자가 자체적으로 생각한 블럭 단위로 주는 것이 바람직하다. 

사용자가 지정한 버퍼의 크기 이상의 문자열 연산이 들어오면 StringBuilder는 추가 버퍼를 생성(위의 예에서는 4096)한 후 이전 버퍼와 연결 리스트를 형성한다. 

[4096] - [4096] - [4096] ...

위와 같은 연결 고리가 형성되는 것이다. StringBuilder의 궁극적인 목적은 ToString()이라고 할 수 있다.

만약 위와 같이 연결 고리가 많이 형성되어 있을 경우에는 ToString()시 4096 단위로 각 노드를 찾은 후 String 변환을 실행해야 한다.

그만큼 각 버퍼들을 순환하며 String 문자열 하나의 객체로 만드는 작업을 진행하기 때문에 속도 측면에서 약간 저하될 수 있다.

위와 같은 경우엔 4096으로 초기 값을 형성하는 것 보단 그보다 몇배수 큰 값을 초기 값으로 형성하는 것이 바람직하다.