Prima di tutto, è necessario rendersi conto che è estremamente difficile, se non impossibile, eseguire i tempi esatti su un computer a causa delle limitazioni esposte sia dall'hardware che dal software. La buona notizia è che questo tipo di precisione è raramente necessario. Dieci tick è un follemente piccolo quantità di tempo. In questo intervallo il lavoro svolto dalla CPU in questo intervallo è molto limitato e non sarà mai statisticamente significativo.
Per riferimento, l'orologio di Windows ha una precisione di circa 10 millisecondi (meno rispetto alle versioni precedenti). Avvolgere il tuo codice con le chiamate a DateTime.UtcNow
non funzionerà meglio di così.
Nella tua domanda parli di voler "creare un evento". Il problema è che l'unico tipo di oggetto di mantenimento del tempo che solleva un evento a intervalli specifici è l'oggetto Timer
. È disponibile in 3 diverse incarnazioni in .NET Framework (System.Timers.Timer
, System.Threading.Timer
e System.Windows.Forms.Timer
), ognuna con scenari di utilizzo unici e peculiarità relative, ma nessuna di queste garantisce precisione ovunque vicino a ciò che si sta chiedendo per . Non sono nemmeno progettati per farlo, né esistono funzioni equivalenti esposte dall'API di Windows che forniranno questo tipo di precisione.
La ragione per cui ho chiesto il motivo per cui si desidera eseguire questa operazione e se si sta tentando di eseguire un benchmark è perché questo cambia l'intero gioco. .NET Framework (dalla versione 2.0) fornisce uno Stopwatch
object espressamente progettato per misurare con precisione il tempo trascorso per una situazione come il benchmarking o il profiling delle prestazioni. Lo Stopwatch
avvolge semplicemente le funzioni API di Windows QueryPerformanceFrequency
e QueryPerformanceCounter
(che dovrebbe confermare il mio suggerimento sull'uso previsto). Avevamo bisogno di P/Richiamare queste funzioni per accedere a questo tipo di funzionalità nelle versioni precedenti del Framework, ma ora è comodamente integrato. Se hai bisogno di un timer con una risoluzione relativamente alta per il benchmarking, lo Stopwatch
è la soluzione migliore . In teoria, può fornire tempi di sottosecondo.
Ma non è privo di problemi. Non genera alcun evento, quindi se il tuo progetto attuale si basa sulla gestione degli eventi, dovrai ripensarlo. E, , non è garantito che sia perfettamente preciso. Certo, potrebbe avere la risoluzione più alta possibile dato i vincoli hardware, ma ciò non significa che soddisferà necessariamente i requisiti dichiarati. Ad esempio, potrebbe non essere affidabile su un sistema con più processori in cui è necessario eseguire Start
e Stop
sullo stesso processore. Non dovrebbe essere importante, ma it does. È anche subject to being unreliable sui processori che possono accelerare e ridurre la velocità di clock. E oserei anche ricordare che la chiamata allo QueryPerformanceCounter
richiederà un po 'di tempo - circa 5 microsecondi anche su un moderno processore 2+ GHz, che ti impedisce di essere effettivamente in grado di raggiungere quel tempo di sottosecondo che suonava bene in teoria. Inoltre, qualsiasi profiler di codice ragionevole considererebbe trascurabile quella quantità di tempo perché, beh, è.
(Vedi anche: http://www.devsource.com/c/a/Techniques/High-Performance-Timing-under-Windows/2/)
fonte
2010-11-18 10:49:52
Perché in tutto il mondo vorresti organizzare un evento ogni 11 tick? Stai usando questo per il profiling del codice? –
Non stai rispondendo alle domande. 11 tick è solo un esempio. tutto quello che voglio è il timer ad alta risoluzione. se possibile, fino a 1 tick. e sì, sto sviluppando un'applicazione per fare qualche punto di riferimento. –
Questo è il motivo per cui supporto i commenti in downvoting –