10 Stimmen

Was ist die maximale Genauigkeit des Timers in .NET?

Ich frage mich, was die Genauigkeit der Timer-Klasse in System.Timers ist, denn es ist ein double (was darauf hindeuten würde, dass Sie Bruchteile von Millisekunden haben können). Wie hoch ist sie?

9voto

ctacke Punkte 65813

Windows-Desktop-Betriebssysteme sind unter 40 ms nicht wirklich genau. Das Betriebssystem ist einfach nicht echtzeitfähig und weist daher erhebliche nicht-deterministische Schwankungen auf. Das bedeutet, dass es zwar Werte im Millisekundenbereich oder sogar darunter melden kann, dass man sich aber nicht darauf verlassen kann, dass diese Werte wirklich aussagekräftig sind. Also auch wenn das Timer-Intervall auf einen Wert im Sub-Millisekundenbereich eingestellt wird, können Sie sich nicht darauf verlassen, dass die Zeit zwischen Einstellung und Auslösung tatsächlich so ist, wie Sie es sich vorgestellt haben.

Hinzu kommt die Tatsache, dass das gesamte Framework, unter dem Sie laufen, nicht-deterministisch ist (die GC könnte Sie suspendieren und eine Sammlung durchführen, während der Timer ausgelöst werden sollte), und Sie enden mit Unmengen von Risiken, wenn Sie versuchen, etwas zu tun, das zeitkritisch ist.

3voto

crander Punkte 31

Vor ein paar Jahren fand ich heraus, dass sie auf etwa 16 ms genau ist... aber ich erinnere mich leider nicht mehr an die Details.

2voto

Julien Lebosquain Punkte 39679

System.Timers.Timer ist seltsam. Er verwendet ein Double als Intervall, ruft aber in Wirklichkeit Math.Ceiling auf und castet das Ergebnis als Int, um es mit einem zugrunde liegenden System.Threading.Timer zu verwenden. Die theoretische Genauigkeit beträgt dann 1ms und man kann kein Intervall angeben, das 2.147.483.647ms überschreitet. Angesichts dieser Informationen weiß ich wirklich nicht, warum ein Double als Intervallparameter verwendet wird.

1voto

shoosh Punkte 73374

Sie können dies leicht selbst herausfinden, indem Sie eine Schleife ausführen, die ständig die resultierende Zeitdauer abtastet, und prüfen, mit welcher Granularität sie abläuft.

0voto

apdevelop Punkte 563

Ich verglich System.Timers.Timer y System.Threading.Timer - beide ergeben systematische Fehler um 8..16 ms, insbesondere bei kleinen Intervallen (1000..6000 ms). Jeder nachfolgende Aufruf der Timer-Routine erfolgte mit einem größeren Intervall als der erste Aufruf. Ein Timer mit einem Intervall von 2000 ms wird beispielsweise in 2000, 4012, 6024, 8036, 10048 Millisekunden usw. ausgelöst (Die Zeitstempel stammen von Environment.TickCount y Stopwatch.ElapsedTicks , beide führen zu den gleichen Ergebnissen).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X