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

Ran*_*der 91 c# performance datetime timing stopwatch

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

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

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

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

Kel*_*sey 75

根据MSDN:

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

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

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

Environment.TickCount与DateTime.Now

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

DateTime对于第二个可能是精确到足够的,但我建议的除此之外的任何东西StopWatch.


Pav*_*dov 31

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

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

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


Rob*_*obb 8

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

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

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