秒表与使用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声音被称为在不同的时间比秒表方法结束。