HOWTO: Visual C# .NET에서 문자열 연결 성능 향상

기술 자료 번역 기술 자료 번역
기술 자료: 306822 - 이 문서가 적용되는 제품 보기.
이 문서는 이전에 다음 ID로 출판되었음: KR306822
모두 확대 | 모두 축소

이 페이지에서

요약

본 문서에서는 기존의 연결 기술과 비교하여 StringBuilder 클래스를 사용할 때 얻을 수 있는 이점을 보여줍니다. .NET Framework에서는 문자열을 바꿀 수 없습니다. 즉, 처음 할당 후에는 참조된 텍스트를 읽을 수만 있습니다. 따라서 성능 면에서는 여러 가지 이점이 제공되지만 C/C++ 문자열 조작 기술에 익숙한 개발자에게는 몇 가지 문제가 발생합니다.

.NET Framework의 문자열에 대한 설명

Visual C/C++에서 strcat()을 통해 문자열 연결 성능을 향상하는 기술 중에는 큰 문자 배열을 버퍼로 할당하고 문자열 데이터를 버퍼에 복사하는 기술이 있습니다. .NET Framework에서는 문자열이 변하지 않기 때문에 문자열을 수정할 수 없습니다. C# + 연결 연산자가 새 문자열을 빌드하므로 대량의 텍스트를 연결할 때는 성능이 낮아집니다.

하지만 .NET Framework에는 문자열 연결에 맞게 최적화된 StringBuilder 클래스가 포함되어 있습니다. 이 클래스는 C/C++에서 문자 배열을 사용하는 것과 같은 이점을 제공하면서 버퍼 크기 증가(필요한 경우)와 길이 추적을 자동으로 처리합니다. 본 문서의 예제 응용 프로그램에서는 StringBuilder 클래스의 사용 방법을 보여주고 연결 성능을 비교합니다.

데모 응용 프로그램 빌드 및 실행

  1. Visual Studio .NET을 시작하고 새 Visual C# 콘솔 응용 프로그램을 만듭니다.
  2. 다음 코드에서는 += 연결 연산자와 StringBuilder 클래스를 사용하여 30개 문자 각각에 대해 5,000회씩 연결합니다. 다음 코드를 Main 프로시저에 추가합니다.
    const int sLen=30, Loops=5000;
    DateTime sTime, eTime;
    int i;
    string sSource = new String('X', sLen);
    string sDest = "";
    // 
    // Time string concatenation.
    // 
    sTime = DateTime.Now;
    for(i=0;i<Loops;i++) sDest += sSource;
    eTime = DateTime.Now;
    Console.WriteLine("Concatenation took " + (eTime - sTime).TotalSeconds + " seconds.");
    // 
    // Time StringBuilder.
    // 
    sTime = DateTime.Now;
    System.Text.StringBuilder sb = new System.Text.StringBuilder((int)(sLen * Loops * 1.1));
    for(i=0;i<Loops;i++) sb.Append(sSource);
    sDest = sb.ToString();
    eTime = DateTime.Now;
    Console.WriteLine("String Builder took " + (eTime - sTime).TotalSeconds + " seconds.");
    // 
    // Make the console window stay open
    // so that you can see the results when running from the IDE.
    // 
    Console.WriteLine();
    Console.Write("Press Enter to finish ... ");
    Console.Read();
  3. 응용 프로그램을 저장한 다음 F5 키를 눌러 응용 프로그램을 컴파일하고 실행합니다. 그러면 다음과 같은 출력이 콘솔 창에 표시됩니다.
    Concatenation took 6.208928 seconds.
    String Builder took 0 seconds.
    
    Press ENTER to finish ...
  4. Enter 키를 눌러 응용 프로그램 실행을 중지하고 콘솔 창을 닫습니다.

문제 해결

  • ASPX Web Form과 같이 데이터 스트리밍을 지원하는 환경에 있거나 응용 프로그램에서 데이터를 디스크에 기록할 경우에는 연결의 버퍼 오버헤드나 StringBuilder 클래스를 사용하지 말고 Response.Write 메서드나 해당 스트림에 적합한 메서드를 통해 스트림에 직접 데이터를 기록하십시오.
  • StringBuilder 클래스를 필요할 때마다 다시 할당하지 말고 기존의 StringBuilder 클래스를 다시 사용해 보십시오. 그러면 불필요한 힙 증가를 억제하고 가비지 수집을 줄일 수 있습니다. 두 경우 모두 StringBuilder 클래스를 사용하면 + 연산자를 사용하는 것보다 효율적으로 힙을 사용할 수 있습니다.

참조

StringBuilder 클래스에는 본 문서에 설명되지 않은 내부 문자열 조작을 위한 메서드가 다수 포함되어 있습니다. 자세한 내용을 보려면 온라인 도움말에서 "StringBuilder"를 검색하십시오.

















속성

기술 자료: 306822 - 마지막 검토: 2001년 11월 2일 금요일 - 수정: 1.0
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Visual C# .NET 2002 Standard Edition
키워드:?
kbhowto kbhowtomaster KB306822

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com