我想跟踪代码的性能,因此我使用System.DateTime.Now
存储了开始和结束时间。我将两者之间的差异作为执行代码的时间。
我注意到差异似乎并不准确。所以我尝试使用Stopwatch
对象。事实证明,这更加准确。
有谁可以告诉我为什么Stopwatch
比使用System.DateTime.Now
计算开始和结束时间之间的差异更准确?
答案 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正在与秒表方法结束时不同的时间被调用。