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. Операционные системы, языки программирования, библиотеки классов и разнообразные инфраструктуры обеспечивают все увеличивающийся уровень абстракции, и иногда мы. программисты, теряем понимание механизмов, лежащих ниже этого уровня абстракции. То, что в коде может выглядеть как простое сложение, реально может быть связано с множеством операций более низкого уровня.