Visual C#을 사용하여 문자열 연결 성능 향상

이 문서에서는 Visual C#에서 문자열 연결 성능을 개선하는 방법에 대한 정보를 제공합니다.

원래 제품 버전: Visual C#
원래 KB 번호: 306822

요약

이 문서에서는 기존 연결 기술보다 클래스를 StringBuilder 사용할 경우의 이점을 보여 줍니다. Microsoft .NET Framework 문자열은 고정되어 있습니다(즉, 참조된 텍스트는 초기 할당 후 읽기 전용임). 많은 성능 이점을 제공하며 C/C++ 문자열 조작 기술에 익숙한 개발자에게 몇 가지 문제를 제기합니다.

이 문서에서는 .NET Framework 클래스 라이브러리 네임스페이스 를 참조합니다System.Text.

.NET Framework 문자열에 대한 설명

Visual C/C++에서 문자열 연결을 strcat() 개선하는 한 가지 방법은 큰 문자 배열을 버퍼로 할당하고 문자열 데이터를 버퍼에 복사하는 것입니다. .NET Framework 문자열은 변경할 수 없으며 현재 위치에서 수정할 수 없습니다. C# + 연결 연산자는 새 문자열을 빌드하고 대량의 텍스트를 연결하면 성능이 저하됩니다.

그러나 .NET Framework 문자열 연결에 최적화된 클래스를 포함합니다StringBuilder. C/C++에서 문자 배열을 사용하고 버퍼 크기를 자동으로 늘리고(필요한 경우) 길이를 추적하는 것과 동일한 이점을 제공합니다. 이 문서의 샘플 애플리케이션은 클래스의 StringBuilder 사용을 보여주고 성능을 연결과 비교합니다.

데모 애플리케이션 빌드 및 실행

  1. Visual Studio를 시작한 다음, 새 Visual C# 콘솔 애플리케이션을 만듭니다.

  2. 다음 코드는 연결 연산자와 StringBuilder 클래스를 사용하여 += 각각 30자의 5,000개의 연결 시간을 지정합니다. 이 코드를 기본 프로시저에 추가합니다.

    const int sLen = 30, Loops = 5000;
    int i;
    string sSource = new String('X', sLen);
    string sDest = "";
    
    // Time string concatenation.
    var stopwatch = System.Diagnostics.Stopwatch.StartNew();
    for (i = 0; i < Loops; i++) sDest += sSource;
    stopwatch.Stop();
    Console.WriteLine($"Concatenation took {stopwatch.ElapsedMilliseconds} ms.");
    
    // Time StringBuilder.
    stopwatch.Restart();
    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();
    stopwatch.Stop();
    Console.WriteLine($"String Builder took {stopwatch.ElapsedMilliseconds} ms.");
    
    // 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 348 ms.
    String Builder took 0 ms.
    Press ENTER to finish...
    
  4. Enter 키를 눌러 애플리케이션 실행을 중지하고 콘솔 창을 닫습니다.

문제 해결

  • ASPX 웹 양식이나 애플리케이션에서 디스크에 데이터를 쓰는 등 데이터 스트리밍을 지원하는 환경에 있는 경우 연결 또는 StringBuilder의 버퍼 오버헤드를 방지하고 메서드 또는 해당 스트림에 대한 적절한 메서드를 통해 Response.Write 스트림에 직접 데이터를 쓰는 것이 좋습니다.

  • 필요할 때마다 다시 할당하는 대신 기존 StringBuilder class 항목을 다시 사용하세요. 이는 힙의 증가를 제한하고 가비지 수집을 줄입니다. 두 경우 모두 클래스를 사용하면 연산자를 StringBuilder 사용하는 것보다 힙을 더 효율적으로 사용할 수 + 있습니다.

참조

클래스에는 이 StringBuilder 문서에 설명되지 않은 현재 위치 문자열 조작을 위한 다른 많은 메서드가 포함되어 있습니다. 자세한 내용은 온라인 도움말에서 을 검색 StringBuilder 합니다.