Повышение производительности объединения строк с помощью Visual C#
В этой статье содержатся сведения о том, как повысить производительность объединения строк в Visual C#.
Исходная версия продукта: Visual C#
Исходный номер базы знаний: 306822
Сводка
В этой статье показаны преимущества использования класса по сравнению с традиционными StringBuilder
методами объединения. Строки в microsoft платформа .NET Framework инвариантны (то есть текст, на который указывает ссылка, доступен только для чтения после первоначального выделения). Он обеспечивает множество преимуществ производительности и создает некоторые проблемы для разработчика, привыкшего к методам работы со строками на C/C++.
В этой статье описывается пространство System.Text
имен библиотеки классов платформа .NET Framework .
Описание строк в платформа .NET Framework
Одним из способов улучшения объединения strcat()
строк в Visual C/C++ является выделение большого массива символов в качестве буфера и копирование строковых данных в буфер. В платформа .NET Framework строка неизменяема, ее нельзя изменить на месте. Оператор объединения C# +
создает новую строку и приводит к снижению производительности при сцеплении больших объемов текста.
Однако платформа .NET Framework включает класс, оптимизированный StringBuilder
для объединения строк. Он обеспечивает те же преимущества, что и использование массива символов в C/C++, а также автоматическое увеличение размера буфера (при необходимости) и отслеживание длины. Пример приложения в этой статье демонстрирует использование StringBuilder
класса и сравнивает производительность с объединением.
Создание и запуск демонстрационного приложения
Запустите Visual Studio, а затем создайте консольное приложение Visual C#.
В следующем коде
+=
операторы объединения иStringBuilder
класс используются для 5000 сцеплений по 30 символов каждый. Добавьте этот код в процедуру main.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...
Нажмите клавишу ВВОД, чтобы остановить выполнение приложения и закрыть окно консоли.
Устранение неполадок
Если вы находитесь в среде, поддерживающей потоковую передачу данных, например в веб-форме ASPX, или приложение записывает данные на диск, рекомендуется избежать дополнительных затрат на буфер объединения или
StringBuilder
, а также записать данные непосредственно в поток с помощьюResponse.Write
метода или соответствующего метода для соответствующего потока.Попробуйте повторно использовать существующий
StringBuilder class
, а не перераспределять каждый раз, когда он вам нужен. Это ограничивает рост кучи и уменьшает сборку мусора. В любом случае использованиеStringBuilder
класса обеспечивает более эффективное использование кучи, чем использование+
оператора .
Ссылки
Класс StringBuilder
содержит множество других методов для управления строками на месте, которые не описаны в этой статье. Дополнительные сведения см StringBuilder
. в веб-справке.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по