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
사용을 보여주고 성능을 연결과 비교합니다.
데모 애플리케이션 빌드 및 실행
Visual Studio를 시작한 다음, 새 Visual C# 콘솔 애플리케이션을 만듭니다.
다음 코드는 연결 연산자와
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();
애플리케이션을 저장합니다. F5 키를 눌러 컴파일한 다음 애플리케이션을 실행합니다. 콘솔 창에는 예제와 유사한 출력이 표시됩니다.
Concatenation took 348 ms. String Builder took 0 ms. Press ENTER to finish...
Enter 키를 눌러 애플리케이션 실행을 중지하고 콘솔 창을 닫습니다.
문제 해결
ASPX 웹 양식이나 애플리케이션에서 디스크에 데이터를 쓰는 등 데이터 스트리밍을 지원하는 환경에 있는 경우 연결 또는
StringBuilder
의 버퍼 오버헤드를 방지하고 메서드 또는 해당 스트림에 대한 적절한 메서드를 통해Response.Write
스트림에 직접 데이터를 쓰는 것이 좋습니다.필요할 때마다 다시 할당하는 대신 기존
StringBuilder class
항목을 다시 사용하세요. 이는 힙의 증가를 제한하고 가비지 수집을 줄입니다. 두 경우 모두 클래스를 사용하면 연산자를StringBuilder
사용하는 것보다 힙을 더 효율적으로 사용할 수+
있습니다.
참조
클래스에는 이 StringBuilder
문서에 설명되지 않은 현재 위치 문자열 조작을 위한 다른 많은 메서드가 포함되어 있습니다. 자세한 내용은 온라인 도움말에서 을 검색 StringBuilder
합니다.
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기