2009-12-10 12 views
6

Dire che ho un metodo Foo() e voglio misurare il tempo in millisecondi impiegato per eseguire quale tipo di Contatore di prestazioni Windows dovrei usare?Qual è il tipo di contatore delle prestazioni più appropriato per misurare il tempo di funzionamento?

var stopwatch = new Stopwatch(); 
stopwatch.Start(); 
Foo(); 
stopwatch.Stop(); 
counter.RawValue = stopwatch.TotalMilliseonds; 

Attualmente sto usando NumberOfItems64 ma che persiste l'ultimo valore del contatore meno che non venga eseguita la nuova operazione. È desiderabile? O il contatore dovrebbe andare a zero non appena l'operazione è terminata? Quale tipo di contatore sceglieresti in questa situazione e perché?

risposta

7

Questo suona come un buon candidato per AverageTimer32. Vedi this SO answer per maggiori dettagli.

+0

Anche se non voglio calcolare il tempo tra le diverse chiamate. –

+0

Non si può davvero fare molto altro, perché cosa registrereste per richieste concorrenti? –

0

Io di solito uso del cronometro, ma ho usato anche P/Invoke per kernel32.dll:

[DllImport("Kernel32.dll")] 
    private static extern bool QueryPerformanceCounter(out long lpPerformanceCount); 

    [DllImport("Kernel32.dll")] 
    private static extern bool QueryPerformanceFrequency(out long lpFrequency); 

Ho due metodi chiamati Start() e stop():

public void Start() 
    { 
    Thread.Sleep(0); 
    QueryPerformanceCounter(out startTime); 
    } 


    public void Stop() 
    { 
    QueryPerformanceCounter(out stopTime); 
    } 

Per interrogare la durata tra le chiamate a Start() e stop():

public double Duration 
    { 
    get 
    { 
     return (double)(stopTime - startTime)*1000/(double)freq; 
    } 
    } 

noti che freq è determinato in costruttore:

public PerformanceTimer() 
    { 
    startTime = 0; 
    stopTime = 0; 

    if (QueryPerformanceFrequency(out freq) == false) 
    { 
     // not supported 
     throw new Win32Exception(); 
    } 
    } 

Per le mie esigenze, non ho notato molta differenza, anche se vi consiglio di provare sia per vedere ciò che più vi si addice.

Modifica: Sono stato in grado di individuare il original code from MSDN. Sembra che ci siano alcuni miglioramenti apportati da .Net 1.1. Il messaggio da portare a casa è che Microsoft rivendica che questo metodo fornisce un'accuratezza di nanosecondi.

+0

Il cronometro utilizza anche QueryPerformanceCounter. Ma domanda non su come misurare l'intervallo di tempo. Riguarda come mantenere un valore misurato per un'analisi successiva. – user1295211

1

Per aggiungere alla risposta precedente, c'è un very good article su entrambi i contatori pre-fatti e su misura delle prestazioni su CodeProject ..

0

una risposta e una domanda:

Risposta: lavori a bassa tecnologia per me. Vuoi microsecondi? Loop it 10^6 volte e usa il tuo orologio.

Domanda: stai chiedendo perché vuoi rendere il tuo codice più veloce? Quindi consider this.

Problemi correlati