我需要找到一个瓶颈,并需要尽可能准确地测量时间。
下面的代码片段是衡量性能的最佳方法吗?
DateTime startTime = DateTime.Now;
// Some execution process
DateTime endTime = DateTime.Now;
TimeSpan totalTimeTaken = endTime.Subtract(startTime);
我需要找到一个瓶颈,并需要尽可能准确地测量时间。
下面的代码片段是衡量性能的最佳方法吗?
DateTime startTime = DateTime.Now;
// Some execution process
DateTime endTime = DateTime.Now;
TimeSpan totalTimeTaken = endTime.Subtract(startTime);
当前回答
使用System.Diagnostics.Stopwatch类。
Stopwatch sw = new Stopwatch();
sw.Start();
// Do some code.
sw.Stop();
// sw.ElapsedMilliseconds = the time your "do some code" took.
其他回答
我很少做这种性能检查(我倾向于认为“这个很慢,让它快一点”),所以我几乎总是这样做。
谷歌确实显示了许多用于性能检查的资源/文章。
许多人提到使用pinvoke来获取性能信息。我研究的很多材料都只提到了使用perfmon..
编辑:
看过秒表的对话..好了!我学到了一些东西:)
这篇文章看起来不错
我在程序中使用的方式是使用StopWatch类,如下所示。
Stopwatch sw = new Stopwatch();
sw.Start();
// Critical lines of code
long elapsedMs = sw.Elapsed.TotalMilliseconds;
如果你想要一些快速和肮脏的东西,我建议使用秒表代替更大程度的精度。
Stopwatch sw = new Stopwatch();
sw.Start();
// Do Work
sw.Stop();
Console.WriteLine("Elapsed time: {0}", sw.Elapsed.TotalMilliseconds);
或者,如果你需要一些更复杂的东西,你可能应该考虑使用第三方分析器,如ANTS。
使用System.Diagnostics.Stopwatch类。
Stopwatch sw = new Stopwatch();
sw.Start();
// Do some code.
sw.Stop();
// sw.ElapsedMilliseconds = the time your "do some code" took.
这篇文章说,首先你需要比较三个替代品,秒表,日期时间。Now AND DateTime.UtcNow。
它还显示在某些情况下(当性能计数器不存在时)Stopwatch正在使用DateTime。UtcNow +一些额外的处理。因此,在这种情况下,DateTime很明显。UtcNow是最好的选择(因为其他使用它+一些处理)
然而,事实证明,计数器几乎总是存在的-参见关于高分辨率性能计数器及其与. net秒表相关的存在的解释?
这是一个性能图表。请注意UtcNow的性能成本与其他选项相比有多低:
X轴是样本数据的大小,Y轴是样本的相对时间。
秒表更好的一点是它能提供更高分辨率的时间测量。另一个原因是它更加面向对象。然而,围绕UtcNow创建一个OO包装器并不难。