Best practice to measure which part of a method takes a lot of time?
在初始化方法中,我调用一些其他方法,操作一些变量并遍历一些列表。现在我注意到加载方法需要一点时间(大约2分钟)。
但问题是,我不太确定方法的哪一部分会花费这么多时间。所以我想测量一下,这样我就可以在这个有最大潜力减少时间的部分工作。
但是什么是衡量这一点的好方法呢?
如果不想使用profiler(如ants性能profiler),可以使用
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上,它都能工作。它不能非常精确地测量问题,但它确实能非常精确地定位问题。(检查本帖最后一段。)