【问题标题】:Stopwatch vs. using System.DateTime.Now for timing events [duplicate]秒表与使用 System.DateTime.Now 进行计时事件 [重复]
【发布时间】:2011-02-24 18:45:51
【问题描述】:

我想跟踪我的代码的性能,所以我使用System.DateTime.Now 存储了开始和结束时间。我将两者之间的差异作为我的代码执行时间。

我注意到差异似乎并不准确。所以我尝试使用Stopwatch 对象。事实证明,这要准确得多。

谁能告诉我为什么Stopwatch 比使用System.DateTime.Now 计算开始时间和结束时间之间的差更准确?

顺便说一句,我说的不是百分之一。我得到了大约 15-20% 的差异。

【问题讨论】:

  • 根据您对 Kelsey 的回答的评论,我有兴趣查看记录开始和停止时间的代码。 11 秒(巨大)的差异与两个类的准确度差异无关,因此必须进行其他操作。
  • 另外,如果您只对两个日期之间的TimeSpan 感兴趣,通常最好使用DateTime.UtcNow 而不是DateTime.Now,因为您通常不希望日光时移和影响结果的其他本地时间变化。
  • @DanielPryden,参见The Case Against DateTime.Now,这正是这一点。 +1

标签: c# performance datetime timing stopwatch


【解决方案1】:

根据MSDN

秒表通过计算底层计时器机制中的计时器滴答来测量经过的时间。如果安装的硬件和操作系统支持高分辨率性能计数器,则 Stopwatch 类使用该计数器来测量经过的时间。否则, Stopwatch 类使用系统计时器来测量经过的时间。使用频率和 IsHighResolution 字段来确定秒表计时实现的精度和分辨率。

它使用比DateTime.Now更高的分辨率/精度。

您还可以查看这些相关链接:

Environment.TickCount vs DateTime.Now

Is DateTime.Now the best way to measure a function's performance?

DateTime 可能足以精确到秒,但除此之外我会推荐StopWatch

【讨论】:

    【解决方案2】:

    最好使用 Stopwatch 类,因为它比减去 DateTime 值更准确:

    Stopwatch s = Stopwatch.StartNew();
    // Tested code here
    s.Stop();
    Console.WriteLine("Elapsed Time: {0} ms", s.ElapsedMilliseconds);
    

    不幸的是,大多数情况下,这段简单的代码不足以获得准确的测量结果,因为在操作系统的底层进行了大量活动,这可能会占用一些 CPU 时间并减慢你的代码。这就是为什么最好多次执行测试,然后删除最低和最高的时间。对于那个目的,有一种方法可以多次执行测试代码,删除最小和最大时间并计算平均时间,这是一个很好的解决方案。我已经发布了sample testing method in my blog

    【讨论】:

    • 我查看了您博客的链接。平均时间计算有轻微误差。而不是double averageTime = ((double)totalTime) / (count - discardCount);,它应该是double averageTime = ((double)totalTime) / (count - (2*discardCount));。没有?
    • 嗨,不应该,博客中的代码是正确的。请查看定义count 的行。定义为:int count = repetitions - discardCount;。这就是为什么在计算平均时间时我只减去一次discardCount(它已经被减去一次)。问候。
    • 没错。没注意它。你是对的。
    • 值得一提的是,另一种衡量时间的方法是只选择 N 次运行中的前 X 个。就像运行它 5 次并使用最好的一样。毕竟,这是对操作系统干扰最小的一个。然而,这两种方法各有利弊
    【解决方案3】:

    这个timing function performance 链接讨论了您的确切问题,特别是这一段:

    问题是根据MSDN,DateTime.Now函数的分辨率是10+毫秒,我们需要调用两次!因此,这将在您的运行时测量中引入 20+ 毫秒的摆动。由于我们的函数调用通常可能比这 20 毫秒的窗口更快地返回,这还不够好。

    编辑:听起来第二个 DateTime.Now 的调用时间与秒表方法结束的时间不同。

    【讨论】:

    猜你喜欢
    • 2015-09-26
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 2015-10-20
    • 2013-12-24
    相关资源
    最近更新 更多