关于c#:衡量一个方法的哪个部分需要花费大量时间的最佳实践?

Best practice to measure which part of a method takes a lot of time?

在初始化方法中,我调用一些其他方法,操作一些变量并遍历一些列表。现在我注意到加载方法需要一点时间(大约2分钟)。

但问题是,我不太确定方法的哪一部分会花费这么多时间。所以我想测量一下,这样我就可以在这个有最大潜力减少时间的部分工作。

但是什么是衡量这一点的好方法呢?


如果不想使用profiler(如ants性能profiler),可以使用Stopwatch来度量运行某些代码所花的时间。

1
2
3
4
5
6
7
8
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();

// Code to time

stopWatch.Stop();

TimeSpan ts = stopWatch.Elapsed;

当然,这会更改您的代码,并要求您在要测量的每个点上进行这些修改。

我建议和许多优秀的资料员一起去(我确信其他答案会指出一些好的答案)。


Dottrace Performance Profiler 4.0提供逐行分析。这就是你需要的。


I'm not quite sure which part of the
method is consuming this much time. So
I'd like to measure it

那些花费的时间比他们应该花的时间长得多的东西是很容易找到的。

例如,如果它花费的时间比它应该花费的时间长10倍,这意味着90%的时间在做一些不需要的事情。因此,如果您在IDE下运行它并暂停它,那么您在ACT中捕获它的几率是90%。只需看看调用堆栈,因为您知道问题就在它的某个地方。如果你不确定你抓住了它,试几次。问题将出现在多个样本上。

我在.NET应用程序启动中发现的典型情况:

  • 不必要地查找国际字符串等资源。
  • 在数据结构中遍历通知树是不必要的。

你发现的可能会有所不同,但你会发现的。

这是一种低技术但有效的方法。不管时间是在CPU上还是在I/O上,它都能工作。它不能非常精确地测量问题,但它确实能非常精确地定位问题。(检查本帖最后一段。)