Повышение производительности объединения строк с помощью 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 класса и сравнивает производительность с объединением.

Создание и запуск демонстрационного приложения

  1. Запустите Visual Studio, а затем создайте консольное приложение Visual C#.

  2. В следующем коде += операторы объединения и 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();
    
  3. Сохраните приложение. Нажмите клавишу F5, чтобы скомпилировать и запустить приложение. В окне консоли должны отображаться выходные данные, аналогичные примерам:

    Concatenation took 348 ms.
    String Builder took 0 ms.
    Press ENTER to finish...
    
  4. Нажмите клавишу ВВОД, чтобы остановить выполнение приложения и закрыть окно консоли.

Устранение неполадок

  • Если вы находитесь в среде, поддерживающей потоковую передачу данных, например в веб-форме ASPX, или приложение записывает данные на диск, рекомендуется избежать дополнительных затрат на буфер объединения или StringBuilder, а также записать данные непосредственно в поток с помощью Response.Write метода или соответствующего метода для соответствующего потока.

  • Попробуйте повторно использовать существующий StringBuilder class , а не перераспределять каждый раз, когда он вам нужен. Это ограничивает рост кучи и уменьшает сборку мусора. В любом случае использование StringBuilder класса обеспечивает более эффективное использование кучи, чем использование + оператора .

Ссылки

Класс StringBuilder содержит множество других методов для управления строками на месте, которые не описаны в этой статье. Дополнительные сведения см StringBuilder . в веб-справке.