2009년 1월 8일 목요일

string 과 StringBuilder의 차이 성능분석


String 객체는 문자열을 빼거나 더할 때 새로운 String 개체를 생성합니다.

또한 편집될수 없는 속성을 가지고 있기 때문에 계속 해서 객체를 생성 하게 됩니다.

그러나 StringBuilder는 자체적인 버퍼를 가지고 있어서 문자열을 더하거나 뺄 때

버퍼를 이용하기 때문에 새롭게 객체를 생성하지 않습니다.

 

String은 레퍼런스 타입 -> 변수에 할당할 때 일어날 때 값의 복사가 아닌 참조가 일어납니다.

.NET 에서는 모든 문자열은 값이 변경될수가 없고 문자열 변수를 통해서 값을 변경해도 실제로는 값이 변경하는 것이 아니라

다른 힙주소를 새로운 메모리영역을 할당 받고 변수의 참조 주소를 바꿔치기 하는것입니다.

우리는 쿼리문을 보통

string  strQyery = “ select * from aaa ”;   1번

strQyery += “ Where c = ‘1’ “;      2번

strQyery += “ And  d = ‘1’ “;        3번

strQyery += “ And  e = ‘1’ “;         4번

이런 식으로 사용한다면  네 번의 Heap 메모리를 잡아 먹게 됩니다.

그러나 StringBuilder를 사용하면 한번만 메모리 할당을 합니다.

빈번하게 string 연산을 하는 경우에는 StringBuiler 를 사용하는게 좋습니다.

 

String 객체 stringBuilder 의 연산 속도 Test

1.100번 더하기 빼기 연산 Test

결과  StringBuilder: 0

string : 0

2.1000번 더하기 빼기 연산 Test

결과  StringBuilder: 0

string : 312,500

3.10000번 더하기 빼기 연산 Test

결과  StringBuilder: 156,250

string : 11,875,000

 

 

               private void Form1_Load(object sender, System.EventArgs e)

               {

                       long Start = 0;

                       long Duration = 0;

                       string s = "";

 

                       Start = System.DateTime.Now.Ticks;

                       s = StringBuilderTest(10000);

                       Duration = System.DateTime.Now.Ticks - Start;

                       textBox1.Text = "StringBuilder: " + Duration.ToString();

 

                       Start = System.DateTime.Now.Ticks;

                       s = StringTest(10000);

                       Duration = System.DateTime.Now.Ticks - Start;

                       textBox2.Text = "string: " + Duration.ToString();

               }

 

               public static string StringTest(int Len)

               {

                       string s = "";

                       for (int i = 0; i < Len; i++)

                              s += i.ToString();

                       return s;

               }

 

               public static string StringBuilderTest(int Len)

               {

                       StringBuilder sb = new StringBuilder();

                       for (int i = 0; i < Len; i++)

                              sb.Append(i.ToString());

                       return sb.ToString();

               }

댓글 없음:

댓글 쓰기