C#DateTime.Now精度

C#DateTime.Now精度

我在进行一些单元测试时遇到了DateTime.UtcNow的一些意外行为。看起来当你快速连续调用DateTime.Now/UtcNow时,它似乎会给你一个长于预期的时间间隔的相同值,而不是捕获更精确的毫秒增量。

我知道有一个秒表类更适合做精确的时间测量,但我很好奇是否有人可以在DateTime中解释这种行为?是否有针对DateTime.Now记录的官方精度(例如,精确到50毫秒内?)?为什么DateTime.Now会不像大多数CPU时钟那样精确?也许它只是为最低公分母CPU而设计的?

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();}


波斯汪
浏览 1728回答 3
3回答

ITMISS

DateTime的精度在某种程度上与其运行的系统有关。精度与上下文切换的速度有关,该速度往往大约为15或16 ms。(在我的系统上,我的测试实际上大约是14毫秒,但我看到一些笔记本电脑的精确度接近35-40毫秒。)Peter Bromberg写了一篇关于&nbsp;C#中高精度代码时序的文章,讨论了这一点。

潇湘沐

我想要一个精确的Datetime.Now :),所以我把它煮熟了:public&nbsp;class&nbsp;PreciseDatetime{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;using&nbsp;DateTime.Now&nbsp;resulted&nbsp;in&nbsp;many&nbsp;many&nbsp;log&nbsp;events&nbsp;with&nbsp;the&nbsp;same&nbsp;timestamp. &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;use&nbsp;static&nbsp;variables&nbsp;in&nbsp;case&nbsp;there&nbsp;are&nbsp;many&nbsp;instances&nbsp;of&nbsp;this&nbsp;class&nbsp;in&nbsp;use&nbsp;in&nbsp;the&nbsp;same&nbsp;program &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;(that&nbsp;way&nbsp;they&nbsp;will&nbsp;all&nbsp;be&nbsp;in&nbsp;sync) &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;readonly&nbsp;Stopwatch&nbsp;myStopwatch&nbsp;=&nbsp;new&nbsp;Stopwatch(); &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;System.DateTime&nbsp;myStopwatchStartTime; &nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;PreciseDatetime() &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reset(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;In&nbsp;case&nbsp;the&nbsp;system&nbsp;clock&nbsp;gets&nbsp;updated &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SystemEvents.TimeChanged&nbsp;+=&nbsp;SystemEvents_TimeChanged; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch&nbsp;(Exception) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;void&nbsp;SystemEvents_TimeChanged(object&nbsp;sender,&nbsp;EventArgs&nbsp;e) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reset(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;SystemEvents.TimeChanged&nbsp;can&nbsp;be&nbsp;slow&nbsp;to&nbsp;fire&nbsp;(3&nbsp;secs),&nbsp;so&nbsp;allow&nbsp;forcing&nbsp;of&nbsp;reset &nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;public&nbsp;void&nbsp;Reset() &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myStopwatchStartTime&nbsp;=&nbsp;System.DateTime.Now; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myStopwatch.Restart(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;System.DateTime&nbsp;Now&nbsp;{&nbsp;get&nbsp;{&nbsp;return&nbsp;myStopwatchStartTime.Add(myStopwatch.Elapsed);&nbsp;}&nbsp;}}
打开App,查看更多内容
随时随地看视频慕课网APP