Шрифт:
//ПРИБЕГАЙТЕ К ЭТОЙ МЕРЕ ТОЛЬКО В ЦЕЛЯХ ТЕСТИРОВАНИЯ! Вызовы
//сборщика мусора в программах вручную будут приводить к снижению
//общей производительности приложений!
System.GC.Collect;
string[] testArray = null;
//--------------------------------------------
//Просмотреть элементы массива и найти
//те из них, в которых средним словом является
//"blue". Заменить "blue" на "orange"
//--------------------------------------------
//Запустить секундомер перед началом выполнения теста
PerformanceSampling.StartSample(2, "DefferedObjects");
//-----------------------------------------------
//БОЛЕЕ ЭКОНОМНЫЙ СПОСОБ: Распределить память для
//объекта до вхождения в цикл
//-----------------------------------------------
LessAllocationsWorkerClass workerClass1;
workerClass1 = new LessAllocationsWorkerClass;
int outerLoop;
for (outerLoop = 0; outerLoop < LOOP_SIZE; outerLoop++) {
//Присвоить элементам массива значения, которые
//мы хотим использовать при тестировании
ResetTestArray(ref testArray);
int topIndex = testArray.Length - 1;
for(int idx = 0; idx <= topIndex; idx++) {
//---------------------------------------------------------
//Более экономный способ:
//Теперь вместо повторного распределения памяти для объекта
//нам достаточно лишь повторно воспользоваться им
//Кроме того: в этом варианте реализации дополнительные
// строки НЕ создаются
//---------------------------------------------------------
//workerClass1 = new WastefulWorkerClass(
// testArray[topIndex]);
workerClass1.ReuseClass(testArray[idx]);
//Если средним словом является "blue", заменить его на "orange"
//--------------------------------------------------
//Более экономный способ:
//При таком способе сравнения не требуется создавать
//никаких дополнительных строк
//--------------------------------------------------
if (workerClass1.CompareMiddleSegment("blue") == 0) {
//Заменить средний сегмент workerClass1.MiddleSegment = "orange";
//Заменить слово
testArray[idx] = workerClass1.getWholeString;
}
}
}
//Остановить секундомер!
PerformanceSampling.StopSample(2);
System.Windows.Forms.MessageBox.Show(PerformanceSampling.GetSampleDurationText(2));
}
Листинг 8.8. Рабочий класс для третьего тестового примера
using System;
public class LessAllocationsWorkerClass {
public string MiddleSegment {
set { m_middleSegmentNew= value; }
}
private string m_middleSegmentNew;
private int m_index_1st_undscore;
private int m_index_2nd undscore;
private string m_stringIn;
public void ReuseClass(string in_word) {
//----------------------------------------------
//Для повторного использования класса необходимо
//полностью очистить внутреннее состояние
//----------------------------------------------
m_index_1st_undscore = -1;