Warum driften DateTime.Now und StopWatch?

8

Ich habe eine kleine Testanwendung in C # erstellt, die DateTime.Now setzt und eine StopWatch startet. Alle zehn Sekunden drucke ich _stopwatch.Elapsed.TotalMilliseconds und (DateTime.Now - _startTime).TotalMilliseconds .

Obwohl ich nicht erwarte, dass die beiden identisch sind, war ich überrascht, dass sie linear um etwa eine Millisekunde pro 20 Sekunden divergieren. Ich nehme an, dass DateTime.Now die Systemuhr aufruft, während die StopWatch irgendeine Art von Akkumulation durchführt?

Beispielausgabe:

%Vor%

Vollständige Quelle: Ссылка

Ausgabe: Ссылка

    
knatten 30.04.2014, 14:16
quelle

3 Antworten

3

Die Antwort ist relativ einfach.

  • Stopwatch zählt Prozessor-Ticks mit einem Leistungsindikator, ein Mechanismus, der zwischen den Prozessoren variiert.
  • DateTime fragt die Systemuhr ab - die Systemuhr wird in regelmäßigen Abständen von Windows aktualisiert, wobei die Ausgabe der (wahrscheinlich Quarz-) Quarzuhr auf Ihrem Motherboard verwendet wird.

Alle Uhren driften und diese zwei verschiedenen Zeitmechanismen werden mit unterschiedlichen Geschwindigkeiten driften.

Unter der Haube verwendet Stopwatch dies API

  

Die Stoppuhr-Klasse unterstützt die Manipulation von Timing-bezogenen   Leistungsindikatoren innerhalb von verwaltetem Code. Insbesondere die Frequenz   field- und GetTimestamp-Methode kann anstelle von unmanaged verwendet werden   Win32 APIs QueryPerformanceFrequency und QueryPerformanceCounter.

DateTime verwendet diese API

    
Gusdor 30.04.2014, 14:24
quelle
3

DateTime.Now tickt alle paar Millisekunden. Außerdem ist die Geschwindigkeit, mit der es läuft, nicht von Maschine zu Maschine festgelegt. Auf modernen Windows-Systemen können Sie erwarten, dass die Tick-Auflösung bei 100 Ticks pro Sekunde liegt.

Auf der anderen Seite fragt StopWatch die CPU-Hardware ab, um eine hohe Genauigkeit zu erhalten. Tatsächlich können Sie die Auflösung von StopWatch mit Stopwatch.Frequency erhalten.

Ich kannte beide oben genannten nicht, bis ich einen interessanten Artikel von Eric Lippert über allgemeine Leistungsbenchmarkfehler gelesen habe, schaut bitte hier hier . Es ist wirklich ein toller Beitrag.

    
Christos 30.04.2014 14:21
quelle
2

Stopwatch ist viel genauer als DateTime , was die Diskrepanz erklären würde

Von MSDN :

  

Die Stoppuhr misst die abgelaufene Zeit durch Zählen von Timer-Ticks im zugrunde liegenden Timer-Mechanismus. Wenn die installierte Hardware und das Betriebssystem einen hochauflösenden Leistungsindikator unterstützen, verwendet die Stoppuhrklasse diesen Indikator, um die verstrichene Zeit zu messen. Andernfalls verwendet die Stoppuhrklasse den Systemzeitgeber, um die verstrichene Zeit zu messen. Verwenden Sie die Felder "Frequency" und "IsHighResolution", um die Genauigkeit und Auflösung der Stoppuhr-Implementierung zu bestimmen.

    
DGibbs 30.04.2014 14:22
quelle

Tags und Links