Mi chiedo quale sia la precisione della classe Timer in System.Timers, perché è un double (che sembrerebbe indicare che è possibile avere frazioni di millisecondi). Che cos'è?Qual è la massima precisione del timer in .NET?
risposta
I sistemi operativi Windows per desktop non sono accurati al di sotto di 40 ms. Il sistema operativo semplicemente non è in tempo reale e pertanto presenta un jitter significativo non deterministico. Ciò significa che, sebbene possa riportare valori fino al millisecondo o anche più piccoli, non si può davvero contare su quei valori per essere veramente significativi. Quindi, anche se l'intervallo del timer viene impostato su un valore di qualche millisecondo, non è possibile fare affidamento sui tempi tra l'impostazione e l'attivazione per essere effettivamente ciò che hai detto di volere.
Aggiungete a questo fatto che l'intero framework su cui state lavorando non è deterministico (il GC potrebbe sospenderti e fare la raccolta duing nel momento in cui il Timer dovrebbe sparare) e vi ritroverete con carichi e carichi di rischio provando fare tutto ciò che è tempo critico
System.Timers.Timer è strano. Usa un doppio come intervallo ma in effetti chiama Math.Ceiling su di esso e lancia il risultato come int da utilizzare con un System.Threading.Timer sottostante. La sua precisione teorica è quindi 1 ms e non è possibile specificare un intervallo che superi 2.147.483.647 ms. Data questa informazione, non so davvero perché venga usato un doppio come parametro dell'intervallo.
Un paio di anni fa ho trovato accurato circa 16ms ... ma purtroppo non ricordo i dettagli.
Quello sarà 15.625 ms == 64Hz, la frequenza dell'orologio di sistema. –
Potete scoprirlo facilmente per voi stessi eseguendo un ciclo che campiona costantemente la durata del tempo risultante e controlla su quale granularità procede.
Ho confrontato System.Timers.Timer
e System.Threading.Timer
- entrambi forniscono errori sistematici intorno a 8,16 ms, in particolare su piccoli intervalli (1000,6000 ms). Ogni successiva chiamata della routine del timer si è verificata con un aumento dell'intervallo dalla prima chiamata. Ad esempio, il timer con un intervallo di 2000 ms scatta nel 2000, 4012, 6024, 8036, 10048 millisecondi e così via (i timestamp ottenuti da Environment.TickCount
e Stopwatch.ElapsedTicks
, danno entrambi gli stessi risultati).
La risoluzione del timer scende al regime 1ms senza molti sforzi di implementazione. Ho appena descritto il motivo della precisione double
in this answer. Quando si configura un sistema da eseguire a 1024 interrupt al secondo (utilizzando l'API del timer multimediale) l'intervallo di tempo tra gli interrupt è 0,9765625 ms. La risoluzione standard per i tempi è di 100ns. Quei valori sono memorizzati come numeri interi. Il valore 0.9765625 non può essere memorizzato senza perdere la precisione in un numero intero con risoluzione di 100 ns. L'ultima cifra (5) rappresenta 500 ps. Quindi la risoluzione deve essere superiore di tre ordini di grandezza. La memorizzazione di questi valori di in numeri interi con una risoluzione di 100 ps è senza speranza poiché un numero intero di 8 byte con una risoluzione di 100 ps avvolgere afer circa 21350 giorni o circa 58 anni. Questo intervallo di tempo è troppo breve per essere accettato da chiunque (ricorda lo scenario Y2K!).
Vedere la risposta collegata per ulteriori informazioni sui dettagli.
- 1. Timer di precisione in .NET
- 2. Qual è la massima precisione dell'opacità CSS3?
- 3. Precisione del timer in java
- 4. Qual è la risoluzione massima di Bitmap C# .NET?
- 5. Precisione del timer OpenVMS, migliore della precisione millisecondo.
- 6. Massima precisione sotto illimitata?
- 7. Qual è la differenza tra "precisione" e "precisione"?
- 8. Qual è la precisione interna di numpy.float128?
- 9. Qual è la dimensione massima di Scripting.Dictionary?
- 10. Memoria massima raggiungibile .NET?
- 11. Qual è la lunghezza massima degli sms concatenati in smpp?
- 12. Qual è la dimensione massima di un ItemView in EWS?
- 13. Qual è la dimensione massima di int (10) in Mysql
- 14. Qual è la dimensione massima per un int in PHP?
- 15. Qual è la lunghezza massima di una stringa in PHP?
- 16. Qual è la dimensione massima del messaggio del datagramma AF_UNIX che può essere inviata in linux?
- 17. Timer ad alta risoluzione (precisione millisecondo) in Go on Windows
- 18. Qual è la prima storia del framework .Net?
- 19. .NET Garbage Collector: qual è la priorità del thread?
- 20. Qual è la proprietà .NET Control.Margin per?
- 21. Qual è il subprocess.Popen lunghezza massima del parametro args?
- 22. Qual è la precisione del mondo degli accelerometri del telefono quando viene utilizzato per il posizionamento?
- 23. Qual è la lunghezza massima dell'URL di Apache?
- 24. .NET: Qual è la dimensione massima consigliata di un tipo di valore?
- 25. Qual è la lunghezza massima di un nome DNS
- 26. Qual è la precisione predefinita di c printf% f?
- 27. Operazioni matematiche di precisione singola in .NET?
- 28. . Timeout Net: WaitForSingleObject vs Timer
- 29. Qual è la dimensione massima del pacchetto per inviare dati tramite Bluetooth in Android?
- 30. problemi doppie precisione su NET
Non è particolarmente critico; sto scrivendo un "processore virtuale" per un gioco di simulazione di robot che utilizza un timer per eseguire le istruzioni ad una velocità specificata e mi chiedo solo quanto in alto posso impostarlo. – RCIX
Non vorrei provare ad andare più frequente di 1ms. Lo scheduler del sistema operativo non farà comunque nulla di più frequente di quello per la tua app. – ctacke
Bene, grazie per le informazioni! – RCIX