Представленный в листинге 7.1 код прост в использовании и имеет небольшие размеры, благодаря чему его включение в мобильное приложение приведет лишь к незначительному увеличению накладных расходов. Этот код предназначен для использования в качестве универсального средства тестирования производительности, при помощи которого вы сможете быстро измерять временные характеристики своих кодов. Это позволит вам быстро оценивать, сколько времени выполняется тот или иной участок разрабатываемого кода, и обнаруживать узкие места, требующие применения новых стратегий. Вы также можете использовать этот код для быстрого сравнения эффективности двух различных подходов, чтобы определить, какой из них лучше соответствует вашим запросам. Так, если для если для настройки пользовательского интерфейса и заполнения иерархического списка в элементе управления TreeView требуется три секунды, то вы можете захотеть изменить алгоритм таким образом, чтобы сначала заполнялись лишь узлы наивысшего уровня, а заполнение дочерних узлов откладывалось на более позднее время и осуществлялось лишь тогда, когда в этом возникнет действительная необходимость. Окончательное решение вы будете принимать на основании результатов соответствующих измерений и оценок качества приложения, предоставляемых конечными пользователями.
using System;
internal class PerformanceSampling {
//Значение этого параметра может быть задано произвольным, но количество
//тестовых интервалов, равное 8, представляется достаточным для
// большинства случаев
const int NUMBER_SAMPLERS = 8;
static string[] m_perfSamplesNames = new string[NUMBER_SAMPLERS];
static int[] m_perfSamplesStartTicks = new int[NUMBER_SAMPLERS];
static int[] m_perfSamplesDuration = new int[NUMBER_SAMPLERS];
//Определить начальное значение счетчика тактов системных часов
//для интервала
internal static void StartSample(int sampleIndex, string sampleName) {
m_perfSamplesNames[sampleIndex] = sampleName;
m_perfSamplesStartTicks[sampleIndex] = System.Environment.TickCount;
}
//Определить конечное значение счетчика тактов системных часов
//для интервала
internal static void StopSample(int sampleIndex) {
int stopTickCount = System.Environment.TickCount;
//Счетчик тактов системных часов сбрасывается в ноль каждые 24,9 дня
//(что соответствует примерно 2 миллиардам миллисекунд).
//Эта маловероятная возможность будет принята нами во внимание
if (stopTickCount >=m_perfSamplesStartTicks[sampleIndex]) {
//Обычно будет выполняться этот код
m_perfSamplesDuration[sampleIndex] = stopTickCount - m_perfSamplesStartTicks[sampleIndex];
} else {
//Значение счетчика тактов "перешло" через ноль,
//и мы должны это учесть
m_perfSamplesDuration[sampleIndex] = stopTickCount + (int.MaxValue - m_perfSamplesStartTicks[sampleIndex]) + 1;
}
}
//Возвратить длительность тестового интервала
//(в миллисекундах)
internal static int GetSampleDuration(int sampleIndex) {
return m_perfSamplesDuration[sampleIndex];
}
//Возвращает длительность истекшего тестового
//интервала в секундах
internal static string GetSampleDurationText(int sampleIndex) {
return m_perfSamplesNames[sampleIndex] + ": " +