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

问题描述:

我正在为C#.NET中的另一个程序编写插件,并且遇到性能问题,其中命令需要更长的时间,我会这样做。该插件会响应主机程序中的事件,并且还取决于主机程序SDK的实用程序方法。我的插件有很多递归函数,因为我正在进行大量的读取和写入树结构。另外,我的插件和主机应用程序之间有很多事件订阅,以及插件中类之间的事件订阅。调试性能问题的最佳方法是什么?

我该如何弄清楚完成任务需要花多长时间?我不能使用常规的断点样式调试,因为它不是无效,而只是它太慢了。我已经设置了一个静态的“LogWriter”类,我可以从我所有的类中引用这些类,这些类将允许我从代码中将时间戳记行写入日志文件。有另一种方法吗? Visual Studio是否保留我可以使用的某种时间戳记录?在应用程序关闭后是否有人查看调用堆栈?

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

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

+0

红门肯定不会做好的软件。他们的ANTS性能分析器是我认为最好的之一。我相信你可以下载试用版。大多数人以后购买真正的版本,所以要警告:)。 – bastijn 2009-07-02 22:49:37

+1

那么微软的分析器也不错,但它只包含在昂贵的VS软件包中。 – arbiter 2009-07-02 22:52:46

听起来就像你想要一个代码'探查器'。 http://en.wikipedia.org/wiki/Code_profiler#Use_of_profilers

我不熟悉哪些分析器对于C#来说是最好的,但是我在遇到了一个快速的谷歌之后发现了一个免费的开源产品列表。我敢肯定,别人会知道哪些是值得考虑的:)

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

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

我有过使用Redgate ANTS Performance Profiler的经验,它可以告诉你应用程序瓶颈的位置。这绝对值得一试。

My Profiler List包括ANTS,dotTrace和AQtime。


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

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

Visual Studio Team System中有一个探查器,它远非完美,但对于简单的应用程序,您可以使其工作。

最近我用EQATECs免费探查器获得了最大成功,或者在需要的地方滚动我自己的小型剖析类。

而且,已经有大约分析器在过去看到不少问题:http://www.google.com.au/search?hl=en&q=site:*.com+.net+profiler&btnG=Google+Search&meta=&aq=f&oq=

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

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

你要找的是在不是绝对必要的多个堆栈样品出现任何声明。它出现的样本越多,花费的时间就越多。判断语句是否有必要的方法是查找堆栈,因为这会告诉您为什么要执行该操作。导致的被消耗时间显著量

什么东西都可以用这种方法来揭示和递归不打扰它。

人们似乎解决这样的问题,在以下两种方法之一:做任何事情之前

  1. 尝试获得良好的测量结果。

  2. 只要找到一件大事,你可以摆脱,撕出来,并重复。

我更喜欢后者,因为它速度很快,而且因为您不必知道肿瘤的大小是多大就知道肿瘤大到可以移除。你需要知道的确切位置在哪里,这就是这种方法告诉你的。