调试性能问题的最佳方法是什么?

时间:2009-07-02 22:40:38

标签: c# .net performance debugging

我正在为C#.NET中的另一个程序编写一个插件,并且遇到性能问题,其中命令需要的时间比我想的要长很多。插件对主机程序中的事件作出反应,并且还取决于主机程序SDK的实用程序方法。我的插件有很多递归函数,因为我正在对树结构进行大量的读写操作。另外,我的插件和主机应用程序之间有很多事件订阅,以及插件中类之间的事件订阅。

我怎样才能弄清楚任务完成需要多长时间?我不能使用常规断点样式调试,因为它不是它不起作用它只是它太慢了。我已经设置了一个静态的“LogWriter”类,我可以从我的所有类中引用它,这样我就可以从我的代码中将带时间戳的行写入日志文件。还有另外一种方法吗? visual studio是否保留了我可以使用的某种带时间戳的日志?应用程序关闭后,有什么方法可以查看调用堆栈吗?

8 个答案:

答案 0 :(得分:16)

您需要使用分析器。这里链接到好的:ANTS Performance Profiler

更新:您还可以使用Debug.Write在控制点中撰写邮件。然后,您需要加载DebugView应用程序,该应用程序显示具有精确时间戳的所有调试字符串。它是免费软件,非常适合快速调试和分析。

答案 1 :(得分:4)

My Profiler List包括ANTS,dotTrace和AQtime。


但是,仔细查看您的问题,在我看来,您应该在进行性能分析的同时进行一些单元测试。也许从快速的整体性能扫描开始,只是为了看哪些区域最需要关注。然后开始为这些区域编写一些单元测试。然后,您可以在运行这些单元测试时运行探查器,以便获得一致的结果。

答案 2 :(得分:2)

根据我的经验,最好的方法也是最简单的。让它运行,当它很慢时,点击IDE中的“暂停”按钮。然后记录调用堆栈。重复几次。 (Here's a more detailed example and explanation.)

您正在寻找的是多个堆栈样本上出现的任何声明,这些声明并非绝对必要。它出现的样本越多,花费的时间就越多。判断语句是否必要的方法是查找堆栈,因为它告诉你它为什么要完成。

这种方法会显示导致大量时间消耗的任何事情,并且递归不会打扰它。

人们似乎有两种方式解决这样的问题:

  1. 在做任何事情之前,尝试做好测量。

  2. 找到一些你可以摆脱的东西,撕掉它,重复一遍。

  3. 我更喜欢后者,因为它很快,而且你不必确切地知道肿瘤有多大才能知道肿瘤大到可以去除。你需要知道的确切位置,这就是这种方法告诉你的。

答案 3 :(得分:1)

听起来你想要一个代码'profiler'。 http://en.wikipedia.org/wiki/Code_profiler#Use_of_profilers

我不熟悉哪种分析器最适合C#,但我在快速google之后遇到了这个链接,其中包含一系列免费的开源产品。我相信别人会知道哪些值得考虑:)

http://csharp-source.net/open-source/profilers

答案 4 :(得分:1)

尽管有这个主题的标题我必须争辩说“最好的”方式是主观的,我们只能建议可能的解决方案。

我有使用Redgate ANTS Performance Profiler的经验,它会告诉您应用程序中的瓶颈所在。这绝对值得一试。

答案 5 :(得分:1)

Visual Studio Team System内置了一个分析器,它远非完美,但对于简单的应用程序,您可以将其运行起来。

最近,我在EQATECs免费分析器方面取得了最大的成功,或者在需要的地方滚动我自己的小型分析类。

此外,过去有很多关于个人资料工作者的问题,请参阅:http://www.google.com.au/search?hl=en&q=site:stackoverflow.com+.net+profiler&btnG=Google+Search&meta=&aq=f&oq=

答案 6 :(得分:0)

不要忘记Rico Mariani's advice如何进行良好的性能调查。

答案 7 :(得分:0)

您还可以为asp.net应用程序使用性能计数器。