Cronometro vs. utilizzo di System.DateTime.Ora per gli eventi di cronometraggio

Volevo monitorare le prestazioni del mio codice, quindi ho archiviato l’ora di inizio e di fine utilizzando System.DateTime.Now . Ho preso la differenza tra i due come il tempo di esecuzione del mio codice.

Ho notato però che la differenza non sembra essere accurata. Così ho provato ad usare un object Stopwatch . Questo si è rivelato molto, molto più accurato.

Qualcuno può dirmi perché il Stopwatch sarebbe più preciso del calcolo della differenza tra un ora di inizio e di fine utilizzando System.DateTime.Now ?

A proposito, non sto parlando di un decimo di punto percentuale. Ottengo una differenza del 15-20%.

Come da MSDN :

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.

Utilizza una risoluzione / precisione superiore rispetto a DateTime.Now .

Puoi anche controllare questi link correlati:

Environment.TickCount vs DateTime.Now

Date Date.Ora il modo migliore per misurare le prestazioni di una funzione?

DateTime è abbastanza buono per precisione al secondo probabilmente, ma qualsiasi cosa oltre a questo raccomanderei StopWatch .

È preferibile utilizzare la class Cronometro perché è molto più accurato rispetto alla sottrazione dei valori DateTime:

 Stopwatch s = Stopwatch.StartNew(); // Tested code here s.Stop(); Console.WriteLine("Elapsed Time: {0} ms", s.ElapsedMilliseconds); 

Sfortunatamente, questa semplice parte di codice non sarà sufficiente per ottenere misurazioni accurate la maggior parte delle volte perché ci sono molte attività in corso sotto il cofano del sistema operativo, che possono rubare un po ‘di tempo alla CPU e rallentare l’esecuzione del codice. Ecco perché è meglio eseguire i test più volte e quindi rimuovere i tempi più bassi e quelli più alti. Per quella puprose è una buona soluzione avere un metodo che esegue il codice testato più volte, rimuove i tempi minimi e massimi e calcola il tempo medio. Ho pubblicato un metodo di test esemplificativo nel mio blog .

questo collegamento per le prestazioni della funzione di cronometraggio discute il tuo problema esatto, in particolare questo paragrafo:

Il problema è che secondo MSDN la risoluzione della funzione DateTime.Now è di 10+ millisecondi, e dobbiamo chiamarla due volte! In tal modo si introdurrebbe uno swing di 20+ ms nella misurazione del tempo di esecuzione. Dato che spesso le nostre chiamate di funzione sono molto più veloci da restituire rispetto a questa finestra da 20 ms, questo non è abbastanza buono.

EDIT: Suona come il secondo DateTime.Ora viene chiamato in un momento diverso rispetto a quando il metodo del cronometro si conclude.