我可以用什么资源来学习分析/优化?

时间:2009-02-15 01:18:10

标签: c# .net optimization profiling

我刚刚继承了一个C#项目,该项目运行缓慢,必须开始优化它。我首先要做的是学习更多关于分析/优化的知识,因为我之前没有这么做。所以问题是我从哪里开始,我可以阅读哪些书籍/博客/关键词?

我知道像ANTS分析器这样的.net分析器等等,但我不知道如何有效地使用它们。我还没有真正使用它,只是让它运行在一些示例应用程序上来播放输出。

11 个答案:

答案 0 :(得分:14)

答案 1 :(得分:4)

我正在攻读本科课程(一个主题是绩效分析),推荐文本为The Art of Computer Systems Performance Analysis: Techniques for Experimental Design, Measurement, Simulation, and Modeling。这是一个关于这个主题的圣经,可能有点矫枉过正。

答案 2 :(得分:3)

如果您熟悉并且已经购买了ANTS(非常精细的探查器),那么请转到here获取快速教程以启动并运行。

答案 3 :(得分:2)

如果您有Visual Studio Team System,我建议使用它包含的Profiler 它位于“Analyze-> Profiler”下 使用此分析器非常简单。你可以潜入,看看你做了什么。练习的实践比你将要阅读的任何文章或书更好。

只需点击几下即可轻松找到您的前几个瓶颈。解决它们可能会变得更加棘手,但同样,优化代码只是一个问题或实践和经验。

答案 4 :(得分:1)

答案 5 :(得分:1)

阅读Rico Mariani's blog。在晋升之前,他是.Net的主要表现调整人。他博客中的旧条目有很多好建议。我会从头开始接近你的前进方向。

那,加上你已经找到的文章(特别是first one)应该可以帮助你开始。

答案 6 :(得分:1)

有分析器和性能分析工具,但是当你试图找到/购买/安装/学习一个时,只需尝试一个老式的技巧......

在IDE下运行应用程序,当它处于缓慢状态时,点击“暂停”按钮,询问它正在做什么,以及为什么。回答这个问题的最佳方法是阅读调用堆栈。

如果它比它应该慢几倍,比如10次,这意味着它花费90%的时间做一些不必要的事情,而就是你抓住它的可能性 。如果你重复这几次,你可以尽可能准确地确认你的怀疑。

所以你不需要昂贵/流行但模糊的放大镜。

因此找到缓慢的原因不是困难的部分,通常有几个。

困难的是,在你修复了一些“低悬的果实”后,你可能不得不面对这样一个事实,即缓慢的主要原因是过度设计。

祝你好运。

答案 7 :(得分:1)

我之前使用过分析器,它们可以提供帮助,但是你可以通过创建一个单独的秒表类型类并“点击”它来获得很多帮助(让它打印出自上次点击以来的时间以及什么是在您认为可能存在问题的方法之前和之后完成那段时间。

如果速度在整个应用程序中都存在问题,那么您可能无法做太多关于它的事情,但您可能会做出一些改变......

寻找内环。这些都是性能死亡。内循环可以由简单的索引到链表中,或者对基于数组的列表进行插入排序。 (一旦我有一个列表框需要花费10-20分钟来填充成千上万的条目,虽然条目太多,但最糟糕的是它通过将每个条目插入数组列表来对其进行排序)。 p>

查看基于按键进行长时间操作的情况。这几乎应该总是在主线程之外完成。

甚至不要认为优化诸如类的数量或它们实例化的频率,字符串连接(在循环之外),使变量或其他任何看起来应该有帮助的愚蠢策略。我已经尝试了一些,当我实际放慢速度时总是感到愚蠢,因为我不像运行时那么聪明。

答案 8 :(得分:1)

我会下载一些可用的分析工具(免费试用版)并开始使用它们。

我使用了jetbrains,还有其他人。 (ants for exampledevpartnera MS one?atomatedqa等)运行它们不应该有太多问题。他们有报告为您提供大量信息,您只需使用应用程序即可快速学习。

他们中的任何一个都可能对你有所帮助,使用试验很好。然后你可以放弃购买工具的决定,或购买最有用/最容易使用的工具。一般来说,他们是节省时间和物有所值的人,尽管有些人可能很贵。 (当有非常好的工具可以少花钱时,我很难处理高端的那些)

在安装和运行它们的第一天,您可能会发现一些严重/重大的性能问题。我知道我做了。

祝你好运。

只需下载一些工具并开始运行您的应用。

编辑:

至于书籍和学习 - 基本上了解代码问题的最好方法是找到错误的代码。很多时候与经验丰富的开发人员进行检查会很有帮助。

作为一个例子:我认为Joel写了一篇关于他做了类似

之类的文章

for(int i = 0; i< strlen(some string); i ++)

很明显,你会在循环的每次迭代中调用strlen(昂贵)。

在探查器告诉您何时花费时间并查看代码是否可以通过简单的事情轻松修复,或者必须在设计中进行更改时,您必须查看一些代码。算法。

答案 9 :(得分:0)

这对C#没什么帮助,但是OS X Shark工具(Apple的开发工具附带)是我遇到的最好的分析工具。几乎使用起来很有趣!

关于剖析,有两种方法。首先,您应该了解该软件。特别是数据结构。除非您首先理解,否则不要开始优化。

其次,你应该衡量(这似乎是你要做的)。我的直觉几乎总是误导我;我认为次要的地方是时间。这也意味着当您进行优化时,您始终会针对您运行的某组测试用例进行优化。选择此类案件很重要。

答案 10 :(得分:0)

你已经使用Profiler击中了头部。所有这些,至少我使用的所有,都遵循相同的基本方法。您选择可执行文件,然后运行该应用程序。

你对输出做的是找到花费最多时间的方法。这不是全部,但你要求一个学习如何优化代码的好方法,所以长时间运行的例程是一个很好的起点。您提到的ANTS将默认显示长时间运行的例程,大多数(如果不是全部)其他例程也是如此。

你可以排除容器方法,比如Main(),除非你有很多代码(不太可能)。

总的来说,我发现大多数浪费在三个方面:

  1. 循环
  2. 递归
  3. 网络延迟
  4. 对于数据库,区域#3通常很容易发现,如果您还要对数据库进行概要分析,因为您将看到命中数。无论是否为数据库(例如,服务调用),减少网络延迟的最佳方法是在消息而不是CRUD中进行通信。不要一次查询每个表。不幸的是,该解决方案通常需要装配许多常见数据层的部分。

    递归和循环是非常相似的问题。如果你想要降压,首先点击内循环。

    在.NET中,您还可以通过学习基本IL并通过Reflector等工具检查应用程序的IL来学习很多关于优化的知识。如果这不是你工作描述的主要部分,或者你可能想要在未来的职业生涯中做些什么,那就浪费一点时间。作为一名消防员付出的代价很高,但作为一名只维护编码人员可能会非常无聊。

    只有几本关于优化和分析.NET应用程序的书籍。在标题中有所优化的那个。 .NET的调试书有一些关于性能分析的信息,但它不是很深。这是一本很好的阅读优化书籍,因为许多导致错误的问题也会出现在优化行程中。