Sto provando a impostare un PerformanceCounter
per misurare il tempo di esecuzione medio di un determinato metodo. Ho provato a leggere su AverageTimer32
e ho esaminato molti esempi, ma non riesco a farlo bene.Confusione su AverageTimer32 PerformanceCounter
ho creato le categorie
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);
Poi creo i contatori
PC = new PerformanceCounter(categoryName, counterName, false);
BPC = new PerformanceCounter(categoryName, baseCounterName, false);
PC.RawValue = 0;
BPC.RawValue = 0;
E infine accedo il tempo trascorso ogni volta che il mio metodo è chiamato
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();
}
Fare come questo, finisco con un risultato nel monitor delle prestazioni che assomiglia a questo. Ricevo picchi invece di una curva continua di circa 50 ms:
Ho frainteso AverageTimer32
? Ho letto a riguardo, ma è un po 'confuso. Tuttavia, ho visto esempi fare praticamente la stessa cosa di me quindi immagino che dovrebbe funzionare. Quale potrebbe essere la ragione per cui ottengo solo punte?
Modifica Potrebbe essere la pena ricordare che TheMethodIWantToMeasure
solo è chiamato ogni ~ 5s, e ho appena realizzato che ricevo il picco ogni ~ 5 ° secondo. Ma non capisco come ciò possa influenzare i risultati se AverageTimer32
utilizza la formula ((N 1 -N 0)/F)/(B 1 -B 0). Non dovrebbe dipendere da quanto spesso memorizzo i valori per N e B?