我需要找到一个瓶颈,并需要尽可能准确地测量时间。
下面的代码片段是衡量性能的最佳方法吗?
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);
当前回答
不,不是。使用秒表(在系统诊断中)
Stopwatch sw = Stopwatch.StartNew();
PerformWork();
sw.Stop();
Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);
秒表自动检查是否存在高精度计时器。
值得一提的是DateTime。Now通常比DateTime慢一些。UtcNow是因为需要在时区、夏令时等方面做一些工作。
DateTime。UtcNow的分辨率通常为15毫秒。请看John Chapman关于DateTime的博客文章。现在我们来做一个精确的总结。
有趣的琐事:秒表回落到DateTime。UtcNow如果你的硬件不支持高频计数器。你可以通过查看静态字段Stopwatch. ishighresolution来检查Stopwatch是否使用硬件来实现高精度。
其他回答
如果你想要一些快速和肮脏的东西,我建议使用秒表代替更大程度的精度。
Stopwatch sw = new Stopwatch();
sw.Start();
// Do Work
sw.Stop();
Console.WriteLine("Elapsed time: {0}", sw.Elapsed.TotalMilliseconds);
或者,如果你需要一些更复杂的东西,你可能应该考虑使用第三方分析器,如ANTS。
这些都是衡量时间的好方法,但这只是发现瓶颈的一种非常间接的方法。
在线程中找到瓶颈的最直接方法是让它运行,当它正在做任何让您等待的事情时,使用暂停或中断键停止它。这样做几次。如果你的瓶颈占用了X%的时间,那么X%就是你在每次快照中捕捉到它的概率。
这里有一个更完整的解释,它是如何以及为什么工作的
我在程序中使用的方式是使用StopWatch类,如下所示。
Stopwatch sw = new Stopwatch();
sw.Start();
// Critical lines of code
long elapsedMs = sw.Elapsed.TotalMilliseconds;
我很少做这种性能检查(我倾向于认为“这个很慢,让它快一点”),所以我几乎总是这样做。
谷歌确实显示了许多用于性能检查的资源/文章。
许多人提到使用pinvoke来获取性能信息。我研究的很多材料都只提到了使用perfmon..
编辑:
看过秒表的对话..好了!我学到了一些东西:)
这篇文章看起来不错
这不够专业:
Stopwatch sw = Stopwatch.StartNew();
PerformWork();
sw.Stop();
Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);
更可靠的说法是:
PerformWork();
int repeat = 1000;
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < repeat; i++)
{
PerformWork();
}
sw.Stop();
Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds / repeat);
在我的实际代码中,我将添加GC。收集调用以将托管堆更改为已知状态,并添加Sleep调用,以便在ETW配置文件中轻松分离不同的代码间隔。