Class StringWriterAppend
Class StringBuilderAppend
Class StringAppened
{
const int iIterations = 10000;
public static void Main()
{
DateTirae dt = DateTime.Now;
string str = String.
for (int i = 0; i < iIterations; i++)
str +="abcclefghijkimnopqrstuvwxyz\r\n";
Console. WriteLine(DateTime. Now - tft);
В этой программе для измерения времени выполнения в начале и конце работы вызывается метод Now класса DateTime. Время выводится в часах, минутах, секундах и сотнях наносекунд. Выполнение каждой операции присоединения строк приводит к появлению нового объекта String. что в свою очередь требует выделения памяти. Каждая предшествующая строка помечается как доступная для сборки мусора. Скорость работы этой программы зависит от скорости компьютера, обычно это длится около 1 минуты.
Более удачным решением в нашем случае будет использование класса StringBuilder, определенного в пространстве имен Svstem.Text. В отличие от строк, хранящихся в объектах класса String class, строки в объектах класса StringBuilder могут изменяться. Класс StringBuilder динамически перераспределяет память, используемую строкой. Как только размер строки превышает размер буфера, объем буфера вырастает вдвое. Для преобразования объекта StringBuilder в объект String служит метод ToString.
Вот переработанный вариант программы, где применяется StringBuilder.
using System;
using System.Text;
{
const tut iIterations = 10000;
public static void Main()
{
DateTime dt = DateTime.Now;
StringBuilder sb = new StringBuilder();
for (int i = 0 ; i < iIterations; i++)
sb.Append("abcdefghijklnrnopqrstuvwxyz\r\n");
string str = sb.ToString();
Console.WriteLine( DateTime. Now - dt);
Время выполнения этой программы — менее секунды. Похоже, что она работает в 1 000 раз быстрее своей предшественницы.
Другой эффективный способ заключается в использовании класса StringWnter. определенного в пространстве имен System JO. Такие классы, как StringWriter и StreamWriter (используемые для записи текстовых файлов), являются производными от абстрактного класса TextWrifer. Как и StringBuilder, класс StringWnter соединяет1 строки. Его большое преимущество — возможность использования целого арсенала методов Write и WriteLine, определенных в классе TextWriter. Вот пример программы, выполняющей ту же задачу, что и две предыдущие, но использующей объект StringWnter.
using System;
using System.10;
{
const int iIterations = 10000;
public static void Main()
DateTime dt = DateTime,Now;
StringWriter sw = new StringWriter();
for (int i = 0; i < iIterations; i++)
sw.WriteLine(“abcdefghijklirmopqrstuvwxyz”);
string str = sw.ToString();
Console,WriteLine(DateTime.Now - dt};
Скорость работы этой программы сравнима со скоростью StringBuilderAppend. Операционные системы, языки программирования, библиотеки классов и разнообразные инфраструктуры обеспечивают все увеличивающийся уровень абстракции, и иногда мы. программисты, теряем понимание механизмов, лежащих ниже этого уровня абстракции. То, что в коде может выглядеть как простое сложение, реально может быть связано с множеством операций более низкого уровня.