关于c#:秒表与使用System.DateTime.Now进行计时事件

Stopwatch vs. using System.DateTime.Now for timing events

本问题已经有最佳答案,请猛点这里访问。

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

我注意到,虽然差异似乎不准确。所以我尝试使用一个Stopwatch对象。结果证明这是非常准确的。

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

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


按MSDN:

The Stopwatch measures elapsed time by counting timer ticks in the underlying timer mechanism. If the installed hardware and operating system support a high-resolution performance counter, then the Stopwatch class uses that counter to measure elapsed time. Otherwise, the Stopwatch class uses the system timer to measure elapsed time. Use the Frequency and IsHighResolution fields to determine the precision and resolution of the Stopwatch timing implementation.

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

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

environment.tickcount与datetime.now

是datetime。现在是衡量函数性能的最佳方法吗?

EDOCX1[1]足够精确到第二个,但除此之外,我推荐EDOCX1[2]。


最好使用秒表类,因为它比减去日期时间值准确得多:

1
2
3
4
Stopwatch s = Stopwatch.StartNew();
// Tested code here
s.Stop();
Console.WriteLine("Elapsed Time: {0} ms", s.ElapsedMilliseconds);

不幸的是,这段简单的代码不足以在大多数情况下获得准确的测量值,因为在操作系统的引擎盖下有很多活动正在进行,这会占用一些CPU时间并减慢代码的执行速度。这就是为什么最好多次执行测试,然后删除最低和最高的时间。对于这个purpose来说,有一个方法可以多次执行测试代码,删除最低和最高的时间,并计算平均时间,这是一个很好的解决方案。我在我的博客中发布了一个样本测试方法。


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

The problem is that according to MSDN the resolution of the DateTime.Now function is 10+ milliseconds, and we need to call it twice! So that would introduce a 20+ ms swing in your runtime measurement. As our function calls are often likely to be a lot quicker to return than this 20ms window this isn’t good enough.

编辑:听起来有点像第二个日期时间。现在调用的时间与秒表方法结束的时间不同。