//эти данные становятся мусором, и память должна быть
//очищена от них.
■
■
//Неэффективный код, выполняющийся внутри цикла...
{
myString = myString +"CustomerID: " +
System.Convert.ToString(customer[idx].id) +
", Name: " + System.Convert.ToString(customer[idx].name);
}
Вместо того чтобы конкатенировать строки и создавать новую строку, для создания отчета можно было бы использовать класс StringBuilder. Класс StringBuilder очень удобно использовать для работы с массивами переменной размерности с целью создания строк. Он позволяет эффективно изменять длину или содержимое массива и, что самое важное, создавать новые строки на основе символьных массивов. Обязательно изучите класс StringBuilder, поскольку умение использовать его имеет решающее значение для написания эффективных алгоритмов, генерирующих строковые данные.
Пример эффективного создания строк
В листинге 8.9 представлены два аналогичных алгоритма, которые приводят к одному и тому же результату. В обоих алгоритмах осуществляется инкрементирование счетчика, и каждый раз, когда значение счетчика увеличивается, его строковое представление добавляется в расширяемый фрагмент текста. Оба алгоритма выполняют одинаковое количество итераций и характеризуются одинаковой степенью сложности написания. И, тем не менее, один из них работает гораздо быстрее другого.
const int COUNT_UNTIL = 300;
const int LOOP_ITERATIONS = 40;
//---------------------------------------------------------
//HE ОЧЕНЬ ЭФФЕКТИВНЫЙ АЛГОРИТМ!
//
//Для имитации создания типичного набора строк используются
//обычные строки
//---------------------------------------------------------
private void button1_Click(object sender, System.EventArgs e) {
//Вызвать сборщик мусора, чтобы тест //начинался с чистого состояния.
//ПРИБЕГАЙТЕ К ЭТОЙ МЕРЕ ТОЛЬКО В ЦЕЛЯХ ТЕСТИРОВАНИЯ! Вызовы
//сборщика мусора в программах вручную будут приводить
//к снижению общей производительности приложений!
System.GC.Collect;
int numberToStore = 0;
PerformanceSampling.StartSample(0, "StringAllocaitons");
string total_result = "";
for (int outer_loop = 0; outer loop < LOOP_ITERATIONS; outer_loop++) {
//Сбросить старый результат total_result = "";