Calcola il tempo di esecuzione di un metodo

Possibile duplicato:
Come si misura la durata di una funzione?

Ho un metodo di acquisizione del tempo I / O che copia i dati da una posizione a un’altra. Qual è il modo migliore e più reale per calcolare il tempo di esecuzione? Thread ? Timer ? Stopwatch ? Qualche altra soluzione? Voglio il più esatto e il più breve ansible.

Stopwatch è progettato per questo scopo ed è uno dei modi migliori per misurare l’esecuzione del tempo in .NET.

 var watch = System.Diagnostics.Stopwatch.StartNew(); // the code that you want to measure comes here watch.Stop(); var elapsedMs = watch.ElapsedMilliseconds; 

Non utilizzare DateTime per misurare l’esecuzione del tempo in .NET.


AGGIORNARE:

Come sottolineato da @ series0ne nella sezione dei commenti: Se si desidera una misura precisa dell’esecuzione di alcuni codici, è necessario utilizzare i contatori delle prestazioni incorporati nel sistema operativo. La seguente risposta contiene una bella panoramica.

Per esperienza personale, la class System.Diagnostics.Stopwatch può essere utilizzata per misurare il tempo di esecuzione di un metodo, tuttavia, ATTENZIONE : Non è del tutto preciso!

Considera il seguente esempio:

 Stopwatch sw = Stopwatch.StartNew(); for(int index = 0; index < 10; index++) { DoSomething(); Console.WriteLine(sw.ElapsedMilliseconds); } sw.Stop(); 

Risultati di esempio

 132ms 4ms 3ms 3ms 2ms 3ms 34ms 2ms 1ms 1ms 

Ora ti stai chiedendo; "bene perché ci sono voluti 132ms la prima volta, e significativamente meno il resto del tempo?"

La risposta è che il Stopwatch non compensa l'attività di "rumore di fondo" in .NET, come JITing. Pertanto, la prima volta che esegui il tuo metodo, .NET JIT è il primo. Il tempo necessario per farlo viene aggiunto al momento dell'esecuzione. Allo stesso modo, anche altri fattori causeranno variazioni nel tempo di esecuzione.

Quello che dovresti davvero cercare per una precisione assoluta è il Performance Profiling !

Dai un'occhiata a quanto segue:

RedGate ANTS Performance Profiler è un prodotto commerciale, ma produce risultati molto accurati. - Potenzia le prestazioni delle tue applicazioni con .NET profiling

Ecco un articolo di StackOverflow sulla profilazione: - Quali sono alcuni buoni profilatori .NET?

Ho anche scritto un articolo su Performance Profiling usando il cronometro che si potrebbe voler vedere - Performance profiling in .NET

StopWatch class StopWatch cerca la soluzione migliore.

 Stopwatch sw = Stopwatch.StartNew(); DoSomeWork(); sw.Stop(); Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds); 

Inoltre ha un campo statico chiamato Stopwatch.IsHighResolution . Naturalmente, questo è un problema di hardware e sistema operativo.

Indica se il timer è basato su un contatore di prestazioni ad alta risoluzione.

Se sei interessato a capire le prestazioni, la risposta migliore è usare un profiler.

In caso contrario, System.Diagnostics.StopWatch fornisce un timer ad alta risoluzione.

StopWatch userà il contatore ad alta risoluzione

Il cronometro misura il tempo trascorso contando i segni di graduazione del timer nel meccanismo del timer sottostante. Se l’hardware e il sistema operativo installati supportano un contatore di prestazioni ad alta risoluzione, la class Cronometro utilizza quel contatore per misurare il tempo trascorso. In caso contrario, la class Cronometro utilizza il timer di sistema per misurare il tempo trascorso. Utilizzare i campi Frequency e IsHighResolution per determinare la precisione e la risoluzione dell’implementazione del cronometro.

Se stai misurando l’IO, le tue cifre saranno probabilmente influenzate da eventi esterni, e mi preoccuperei molto di più. esattezza (come hai indicato sopra). Prenderò invece una serie di misurazioni e considererò la media e la distribuzione di quelle figure.