秒表与使用 System.DateTime.Now 进行计时事件

问题描述 投票:0回答:3

我想跟踪代码的性能,因此我使用

System.DateTime.Now
存储了开始和结束时间。我将两者之间的差异作为我的代码执行时间。

但我注意到差异似乎并不准确。所以我尝试使用

Stopwatch
对象。事实证明,这要准确得多。

谁能告诉我为什么

Stopwatch
比使用
System.DateTime.Now
计算开始时间和结束时间之间的差异更准确?

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

c# performance datetime timing stopwatch
3个回答
88
投票

根据 MSDN

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

它使用比

DateTime.Now
更高的分辨率/精度。

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

Environment.TickCount 与 DateTime.Now

DateTime.Now 是衡量函数性能的最佳方法吗?

DateTime
对于精确到秒来说可能已经足够好了,但除此之外我会推荐
StopWatch


37
投票

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

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

不幸的是,这段简单的代码在大多数情况下不足以获得准确的测量结果,因为操作系统底层正在进行大量活动,这可能会占用一些 CPU 时间并减慢代码的执行速度。这就是为什么最好多次执行测试,然后删除最低和最高次数。对于该 puprose,有一个方法可以多次执行测试代码,删除最低和最大时间并计算平均时间,这是一个很好的解决方案。我在我的博客中发布了示例测试方法


9
投票

这个定时功能性能链接讨论了您的确切问题,特别是这一段:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.