DateTime.Now是衡量函数性能的最佳方法吗?
我需要找到一个瓶颈,并且需要尽可能准确地衡量时间。
下面的代码片段是衡量性能的最佳方式吗?
DateTime startTime = DateTime.Now;
// Some execution process
DateTime endTime = DateTime.Now;
TimeSpan totalTimeTaken = endTime.Subtract(startTime);
不,这不对。 使用秒表(在System.Diagnostics
)
Stopwatch sw = Stopwatch.StartNew();
PerformWork();
sw.Stop();
Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);
秒表会自动检查是否存在高精度计时器。
值得一提的是, DateTime.Now
通常比DateTime.UtcNow
慢很多,因为必须用时区,DST等来完成这项工作。
DateTime.UtcNow通常具有15毫秒的分辨率。 请参阅John Chapman关于DateTime.Now
精度的博文,了解最佳总结。
有趣的琐事:如果您的硬件不支持高频计数器,秒表会回退到DateTime.UtcNow
。 您可以通过查看静态字段Stopwatch.IsHighResolution来查看Stopwatch是否使用硬件实现高精度。
如果你想快速和肮脏的东西,我会建议使用秒表,而不是更高的精度。
Stopwatch sw = new Stopwatch();
sw.Start();
// Do Work
sw.Stop();
Console.WriteLine("Elapsed time: {0}", sw.Elapsed.TotalMilliseconds);
另外,如果你需要更复杂一点的东西,你应该考虑使用第三方分析器,比如ANTS。
这篇文章说,首先你需要比较三种选择, Stopwatch
, DateTime.Now
和DateTime.UtcNow
。
它还表明,在某些情况下(当性能计数器不存在时)秒表正在使用DateTime.UtcNow +一些额外的处理。 因为这很明显,在这种情况下,DateTime.UtcNow是最好的选择(因为其他人使用它+一些处理)
但事实证明,计数器几乎总是存在 - 请参阅有关高分辨率性能计数器的说明及其与.NET Stopwatch相关的说明?
这是一个性能图。 请注意UtcNow与其他方案相比性能低下的成本:
X轴是样本数据大小,Y轴是示例的相对时间。
Stopwatch
更Stopwatch
的一点是它提供了更高分辨率的时间测量。 另一个是它更多的面向对象的性质。 但是,围绕UtcNow
创建OO包装并不难。
上一篇: Is DateTime.Now the best way to measure a function's performance?