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

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

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

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

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

根据MSDN :

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

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

你也可以看看这些相关的链接:

Environment.TickCount vs DateTime.Now

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

DateTime时间足够精确到第二个可能,但除此之外,我会推荐StopWatch

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

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

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

此计时function性能链接讨论您的具体问题,具体来说这一段:

问题是,根据MSDN DateTime.Now函数的parsing是10 +毫秒,我们需要调用它两次! 所以这会在你的运行时间测量中引入20 + ms的摆动。 由于我们的函数调用往往比这个20ms的窗口要快得多,这还不够好。

编辑:它有点像第二个DateTime.Now声音被称为在不同的时间比秒表方法结束。