2013-03-25 7 views
9

Я пытаюсь настроить PerformanceCounter для измерения среднего времени выполнения определенного метода. Я пробовал читать на AverageTimer32, и я просмотрел множество примеров, но я просто не могу понять, как это правильно.Путаница о AverageTimer32 PerformanceCounter

Я создал категорию

CounterCreationDataCollection CCDC = new CounterCreationDataCollection(); 

// Add the counter. 
CounterCreationData averageTimer32 = new CounterCreationData(); 
averageTimer32.CounterType = PerformanceCounterType.AverageTimer32; 
averageTimer32.CounterName = counterName; 
CCDC.Add(averageTimer32); 

// Add the base counter. 
CounterCreationData averageTimer32Base = new CounterCreationData(); 
averageTimer32Base.CounterType = PerformanceCounterType.AverageBase; 
averageTimer32Base.CounterName = baseCounterName; 
CCDC.Add(averageTimer32Base); 

// Create the category. 
PerformanceCounterCategory.Create(categoryName, "Demonstrates usage of the AverageTimer32 performance counter type", PerformanceCounterCategoryType.SingleInstance, CCDC); 

Затем я создаю счетчики

PC = new PerformanceCounter(categoryName, counterName, false); 

BPC = new PerformanceCounter(categoryName, baseCounterName, false); 

PC.RawValue = 0; 
BPC.RawValue = 0; 

И, наконец, я вхожу истекшее время каждый раз, когда мой метод называется

private void TheMethodIWantToMeasure() { 
    Stopwatch stopwatch = Stopwatch.StartNew(); 

    // Fake work that take ~50ms 
    Thread.Sleep(50 + random.Next(-10, 10)); 

    stopwatch.Stop(); 

    PC.IncrementBy(stopwatch.ElapsedTicks); 
    BPC.Increment(); 
} 

Делать, как В результате я получаю результат в виде монитора производительности. Я получаю шипы вместо критической кривой около 50 мс: Picture

Я не понял AverageTimer32? Я читал об этом, но это немного запутанно. Тем не менее, я видел примеры, делающие практически то же самое, что и я, поэтому я предполагаю, что это должно сработать. Что может быть причиной того, что я получаю шипы?

Редактировать Может быть, стоит отметить, что TheMethodIWantToMeasure только называется каждые ~ 5s, и я просто понял, что я получаю шип каждый пятый ~ второй. Но я не понимаю, как это может повлиять на результаты, если AverageTimer32 использует формулу ((N 1 -N 0)/F)/(B 1 -B 0). Это не должно зависеть от того, как часто я храню значения для N и B?

ответ

1

Ваш ответ заключается в частоте обновления/выборки параметров вашего пермона. Если вы должны были вытащить свой ~ 5s или изменить его на что-то вроде ~ 10ms, вы, вероятно, заметите, что график выглядит немного больше, как вы ожидали. В качестве альтернативы обновить частоту обновления счетчика производительности до более высокого интервала (30 секунд) будет одинаковым. (Сделайте это, щелкнув правой кнопкой мыши по графику perfMon -> свойства -> вкладка «Общие» -> «Sampe» каждые x секунд).

Причина в том, что perfMon обновляется каждые 1 секунду (по умолчанию), а затем отображает среднее значение. Так что «все» операции, которые вы добавили к своим счетчикам за эту секунду, и выкладывают их на графике.

Пример: Если вы имели операции выполняющиеся в секунду (0,1 мс, 0,2 мс & 0.3, мс), PERFMON будет отображать среднее быть 0,2 мс, что является правильным.

Почему пробелы? Я считаю, что это связано с тем, что теперь, когда ваш средний показатель был рассчитан, и вы увидите свой «Спайк», в следующую секунду (когда perfMon снова обновится), он будет вычислять среднее значение 0 операций в 0 сек. = 0.

Мое предложение (если вы хотите по-настоящему увидеть среднее время, в течение которого ваш TheMethodIWantToMeasure занимает в среднем до запуска, составляет . Сделайте свой интервал ~ 5 секунд полностью и просто позвольте методу постоянно работать. Это должно сделать трюк.

Смежные вопросы