看起来没有免费的.NET性能分析工具可以逐行分析性能。因此,我正在考虑使用Stopwatch进行性能分析。
* 免费是指自由,即许可证包括商业应用程序。
编辑:针对那些告诉我“购买分析器”的人,我想这样做,但如果我可以花那么多钱,我会把它花在其他事情上。我试图说服老板一个分析器是值得的,但运气不太好。这个问题主要基于好奇心。我永远不会考虑用Stopwatch替代真正的分析工具。
我有一个小的测试应用程序(用C#编写),用于基于每行使用Stopwatch测量性能差异。测试代码如下:
int n = 100;
BigInteger f = 1;
for (int i = n; i > 1; i--)
{
f *= i;
}
以下是完整代码:http://pastebin.com/AvbQmT32
我为每行代码设置了一个计时器,这是我的“分析器”。我还有一个计时器用于整个程序,这是我的“分析器分析器”。
我将程序配置为发布模式、任意CPU(在x64机器上),并禁用优化。
当我禁用分析器运行程序时,会得到类似以下的结果:
Line | Ticks
------------------------------|----------
|
Total time: | 359
当我启用分析器运行它时,我会得到类似这样的结果:
Line | Ticks
------------------------------|----------
|
int n = 100; | 3
BigInteger f = 1; | 12
for (int i = n; i > 1; i--) | 325
{ |
f *= i; | 539
} |
|
Total time: | 1710
Stopwatch overhead: | 831
理想情况下,代码的耗时应该在两种情况下相等,但似乎Stopwatch的开销(overhead)会在它们自己的经过时间中出现。现在,需要对程序的每一行进行性能分析通常没有意义,因为采用分而治之的方法通常更有效。您可以通常从对代码块进行性能分析开始,并缩小任何性能问题的范围。
此外,在大多数应用程序中,平均代码行的速度要慢得多比测试程序中的代码要慢。这意味着 Stopwatch 的开销将会更少。
然而,使用 Stopwatches 仍然会有开销,特别是如果您使用了很多个。
那么到了问题的核心:
使用 Stopwatches 进行性能分析最有效的方法是什么?如何将开销最小化?将 Stopwatch 包装在单个语句周围是否值得?
感谢您的反馈。