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: Ссылка
Die Antwort ist relativ einfach.
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
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.
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.
Tags und Links c#