2013-03-25 11 views
9

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: Picture

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?

risposta

1

La tua risposta si trova nella frequenza di aggiornamento/campionamento delle impostazioni del permone. Se dovessi prendere il tuo intervallo ~ 5s o almeno modificarlo in qualcosa come ~ 10ms, probabilmente noterai che il grafico sembra un po 'più come inizialmente previsto. In alternativa, aggiornare la frequenza di aggiornamento del contatore delle prestazioni a un intervallo più alto (30 secondi) sarebbe la stessa. (Per fare ciò, fare clic con il tasto destro sul grafico perfMon -> proprietà -> scheda Generale -> Sampe ogni x secondi).

Il motivo è che perfMon si aggiorna ogni 1 secondo (per impostazione predefinita) e quindi deve visualizzare la media. Quindi ci vuole "all" le operazioni che hai aggiunto ai tuoi contatori per quel secondo e lo traccia sul grafico.

Esempio: Se tu avessi operazioni esecuzione in un secondo (0,1ms, 0,2ms & 0.3, ms), perfmon visualizzerà la vostra media di essere 0.2ms, che è corretto.

Perché le lacune? Credo che sia perché ora dopo che la tua media è stata calcolata e vedi il tuo "Spike", il secondo successivo (quando perfMon si aggiorna di nuovo), calcola la media di 0 operazioni in 0secs = 0.

Il mio suggerimento (se tu vuoi veramente vedere la media di quanto tempo il tuo TheMethodIWantToMeasure impiega in media, è a prendi il tuo intervallo ~ 5s completamente e lascia semplicemente che il metodo continui a funzionare.Questo dovrebbe fare il trucco