Ich habe gerade ein unerwartetes Verhalten mit DateTime.UtcNow festgestellt, als ich einige Unit-Tests durchgeführt habe. Wenn Sie DateTime.Now/UtcNow schnell hintereinander aufrufen, erhalten Sie anscheinend den gleichen Wert für ein länger als erwartetes Zeitintervall zurück, anstatt genauere Millisekunden-Inkremente zu erfassen.
Ich weiß, dass es eine Stoppuhrklasse gibt, die sich besser für präzise Zeitmessungen eignet, aber ich war neugierig, ob jemand dieses Verhalten in DateTime erklären könnte. Gibt es eine offizielle Genauigkeit, die für DateTime.Now dokumentiert ist (z. B. auf 50 ms genau?)? Warum sollte DateTime.Now weniger präzise sein als die meisten CPU-Uhren? Vielleicht ist es nur für die CPU mit dem kleinsten gemeinsamen Nenner ausgelegt?
public static void Main(string[] args)
{
var stopwatch = new Stopwatch();
stopwatch.Start();
for (int i=0; i<1000; i++)
{
var now = DateTime.Now;
Console.WriteLine(string.Format(
"Ticks: {0}\tMilliseconds: {1}", now.Ticks, now.Millisecond));
}
stopwatch.Stop();
Console.WriteLine("Stopwatch.ElapsedMilliseconds: {0}",
stopwatch.ElapsedMilliseconds);
Console.ReadLine();
}
Antworten:
Eine gute Uhr sollte sowohl präzise als auch genau sein . das sind anders. Wie der alte Witz schon sagt, ist eine angehaltene Uhr zweimal am Tag genau, eine Uhr, die eine Minute langsam ist, zu keiner Zeit genau. Aber die Uhr, die eine Minute langsamer ist, ist immer auf die nächste Minute genau, während eine angehaltene Uhr überhaupt keine nützliche Genauigkeit hat.
Warum sollte die DateTime auf eine Mikrosekunde genau sein, wenn sie möglicherweise nicht auf die Mikrosekunde genau sein kann ? Die meisten Menschen haben keine Quelle für offizielle Zeitsignale, die auf die Mikrosekunde genau sind. Daher sechs Stellen nach dem Komma geben Präzision , die letzten fünf davon sind Müll würde liegend .
Denken Sie daran, dass DateTime ein Datum und eine Uhrzeit darstellt . Hochpräzise Timings sind überhaupt nicht der Zweck von DateTime. Wie Sie bemerken, ist dies der Zweck von StopWatch. Der Zweck von DateTime besteht darin, ein Datum und eine Uhrzeit für Zwecke wie die Anzeige der aktuellen Uhrzeit für den Benutzer, die Berechnung der Anzahl der Tage bis zum nächsten Dienstag usw. darzustellen.
Kurz gesagt: "Wie spät ist es?" und "wie lange hat das gedauert?" sind ganz andere Fragen; Verwenden Sie kein Tool zur Beantwortung einer Frage, um die andere zu beantworten.
Danke für die Frage; Dies wird einen guten Blog-Artikel machen! :-)
quelle
Die Genauigkeit von DateTime ist etwas spezifisch für das System, auf dem es ausgeführt wird. Die Genauigkeit hängt von der Geschwindigkeit eines Kontextwechsels ab, die tendenziell bei 15 oder 16 ms liegt. (Auf meinem System sind es ungefähr 14 ms von meinen Tests, aber ich habe einige Laptops gesehen, bei denen die Genauigkeit näher an 35-40 ms liegt.)
Peter Bromberg schrieb einen Artikel über hochpräzises Code-Timing in C #, in dem dies diskutiert wird.
quelle
Ich hätte gerne eine genaue Datetime.Now :), also habe ich mir das ausgedacht:
quelle
Aus MSDN geht hervor , dass
DateTime.Now
die Auflösung auf allen NT-Betriebssystemen ungefähr 10 Millisekunden beträgt.Die tatsächliche Genauigkeit hängt von der Hardware ab. Mit kann eine bessere Präzision erzielt werden
QueryPerformanceCounter
.quelle
Eric Lippert gab einen Kommentar zu dieser SO-Frage ab, in dem er sagte, dass DateTime nur auf ca. 30 ms genau ist. Der Grund dafür, dass er nicht nanosekundengenau ist, ist in seinen Worten, dass es "nicht sein muss".
quelle
Aus der MSDN-Dokumentation :
Sie behaupten auch, dass die ungefähre Auflösung unter Windows NT 3.5 und höher 10 ms beträgt :)
quelle
Infolgedessen können wiederholte Aufrufe der Now-Eigenschaft in einem kurzen Zeitintervall, z. B. in einer Schleife, denselben Wert zurückgeben.
MSDN Link
quelle