我想跟踪我的代码的性能,所以我使用System.DateTime.Now
. 我将两者之间的差异作为我的代码执行时间。
我注意到虽然差异似乎并不准确。所以我尝试使用一个Stopwatch
对象。事实证明,这要准确得多。
谁能告诉我为什么Stopwatch
比使用计算开始时间和结束时间之间的差异更准确System.DateTime.Now
?
顺便说一句,我说的不是十分之一。我得到大约 15-20% 的差异。
我想跟踪我的代码的性能,所以我使用System.DateTime.Now
. 我将两者之间的差异作为我的代码执行时间。
我注意到虽然差异似乎并不准确。所以我尝试使用一个Stopwatch
对象。事实证明,这要准确得多。
谁能告诉我为什么Stopwatch
比使用计算开始时间和结束时间之间的差异更准确System.DateTime.Now
?
顺便说一句,我说的不是十分之一。我得到大约 15-20% 的差异。
根据MSDN:
秒表通过计算底层计时器机制中的计时器滴答来测量经过的时间。如果安装的硬件和操作系统支持高分辨率性能计数器,则 Stopwatch 类使用该计数器来测量经过的时间。否则, Stopwatch 类使用系统计时器来测量经过的时间。使用频率和 IsHighResolution 字段来确定秒表计时实现的精度和分辨率。
它使用比DateTime.Now
.
您还可以查看这些相关链接:
Environment.TickCount 与 DateTime.Now
DateTime
可能足以精确到第二个,但我会推荐除此之外的任何东西StopWatch
。
最好使用 Stopwatch 类,因为它比减去 DateTime 值更准确:
Stopwatch s = Stopwatch.StartNew();
// Tested code here
s.Stop();
Console.WriteLine("Elapsed Time: {0} ms", s.ElapsedMilliseconds);
不幸的是,在大多数情况下,这段简单的代码不足以获得准确的测量结果,因为在操作系统的底层进行了大量活动,这可能会占用一些 CPU 时间并减慢代码的执行速度。这就是为什么最好多次执行测试然后删除最低和最高时间的原因。对于那个目的,有一种方法可以多次执行测试代码,删除最小和最大时间并计算平均时间,这是一个很好的解决方案。我在我的博客中发布了一个示例测试方法。
此计时功能性能链接讨论了您的确切问题,特别是本段:
问题是,根据 MSDN,DateTime.Now 函数的分辨率是 10+ 毫秒,我们需要调用它两次!因此,这将在您的运行时测量中引入 20+ 毫秒的摆动。由于我们的函数调用通常可能比这个 20 毫秒的窗口更快地返回,这还不够好。
编辑:听起来第二个 DateTime.Now 的调用时间与秒表方法结束的时间不同。