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

秒表与将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们

TA贡献1886条经验 获得超2个赞

根据MSDN:


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


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


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


Environment.TickCount与DateTime.Now


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


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


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

TA贡献2003条经验 获得超2个赞

最好使用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

TA贡献1831条经验 获得超10个赞

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


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


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


查看完整回答
反对 回复 2019-10-21
  • 3 回答
  • 0 关注
  • 713 浏览
慕课专栏
更多

添加回答

举报

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