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

时间:2010-05-27 17:16:23

标签: c# performance datetime timing stopwatch

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

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

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

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

3 个答案:

答案 0 :(得分:73)

根据MSDN

  

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

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

您还可以查看以下相关链接:

Environment.TickCount vs DateTime.Now

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

DateTime对于精确到第二个可能已经足够了,但除此之外,我建议使用StopWatch

答案 1 :(得分:29)

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

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

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

答案 2 :(得分:7)

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

  

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

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