为了账号安全,请及时绑定邮箱和手机立即绑定

秒表与将System.DateTime.Now用于计时事件进行对比

/ 猿问

秒表与将System.DateTime.Now用于计时事件进行对比

慕桂英546537 2019-10-21 09:58:49

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

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

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

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


查看完整描述

3 回答

?
MM们

根据MSDN:


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


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


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


Environment.TickCount与DateTime.Now


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


DateTime足够精确到秒,但是我推荐的以外的任何东西StopWatch。


查看完整回答
反对 回复 2019-10-21
?
湖上湖

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


Stopwatch s = Stopwatch.StartNew();

// Tested code here

s.Stop();

Console.WriteLine("Elapsed Time: {0} ms", s.ElapsedMilliseconds);

不幸的是,这段简单的代码大部分时间都无法获得准确的测量结果,因为在OS的内部进行了大量的活动,这可能会占用一些CPU时间并减慢代码的执行速度。这就是为什么最好多次执行测试,然后删除最低和最高的时间。对于那个小女孩来说,拥有一种方法可以多次执行被测试的代码,删除最短和最大的时间并计算平均时间是一个很好的解决方案。我已经在博客中发布了一种示例测试方法。


查看完整回答
反对 回复 2019-10-21
?
慕哥6287543

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


问题是,根据MSDN,DateTime.Now函数的分辨率为10毫秒以上,我们需要调用两次!因此,这会在您的运行时测量中引入20毫秒以上的摆幅。由于我们的函数调用返回时间通常可能比20ms窗口快得多,因此这还不够好。


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


查看完整回答
反对 回复 2019-10-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信