101

我想跟踪我的代码的性能,所以我使用System.DateTime.Now. 我将两者之间的差异作为我的代码执行时间。

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

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

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

4

3 回答 3

84

根据MSDN

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

它使用比DateTime.Now.

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

Environment.TickCount 与 DateTime.Now

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

DateTime可能足以精确到第二个,但我会推荐除此之外的任何东西StopWatch

于 2010-05-27T17:24:52.810 回答
35

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

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

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

于 2012-07-06T09:49:55.777 回答
8

计时功能性能链接讨论了您的确切问题,特别是本段:

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

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

于 2010-05-27T17:28:15.020 回答