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。


这篇文章说,首先你需要比较三种选择, StopwatchDateTime.NowDateTime.UtcNow

它还表明,在某些情况下(当性能计数器不存在时)秒表正在使用DateTime.UtcNow +一些额外的处理。 因为这很明显,在这种情况下,DateTime.UtcNow是最好的选择(因为其他人使用它+一些处理)

但事实证明,计数器几乎总是存在 - 请参阅有关高分辨率性能计数器的说明及其与.NET Stopwatch相关的说明?

这是一个性能图。 请注意UtcNow与其他方案相比性能低下的成本:

在这里输入图片说明

X轴是样本数据大小,Y轴是示例的相对时间。

StopwatchStopwatch的一点是它提供了更高分辨率的时间测量。 另一个是它更多的面向对象的性质。 但是,围绕UtcNow创建OO包装并不难。

链接地址: http://www.djcxy.com/p/40359.html

上一篇: Is DateTime.Now the best way to measure a function's performance?

下一篇: Find time it takes for a C++ function to run