当前位置: 首页 > 编程语言 > C#

我可以使用哪些资源来学习分析-优化?分享

时间:2023-04-10 22:11:52 C#

我可以使用哪些资源来学习分析/优化?我刚刚继承了一个运行缓慢的C#项目,不得不开始优化它。我要做的第一件事是学习更多关于分析/优化的知识,因为我以前没有做过。所以问题是我从哪里开始,我可以阅读哪些书籍/博客/关键字?我知道.net分析器,如ANTS分析器等,但我不知道如何有效地使用它们。我还没有真正使用过它,只是让它在几个示例应用程序上运行以播放输出。优化代码有两个步骤。首先,您需要找出什么是缓慢的。这就是概要分析,正如您可能猜到的那样,概要分析器通常用于此目的。大多数分析仪通常简单易用。您通过探查器运行您的应用程序,当它终止时,探查器将显示每个函数花费了多少时间,独占(此函数不计算从该函数调用的函数中花费的时间)和包含(花费的时间)函数,包括子函数调用)。换句话说,你得到一个很大的调用树,你只需要寻找大量的数字。通常,很少有函数会占用超过10%的执行时间。所以找到这些你就知道要优化什么了。请注意,探查器既不是必需的,也不一定是最佳方法。一种非常简单但有效的方法是在调试器中运行程序并在几个准随机时间暂停执行并查看调用堆栈。只这样做几次,您就会很清楚执行时间的成本。@MikeDunlavey对此答案的评论在别处对这种方法进行了深入描述。但既然您知道执行时间花在了哪里,棘手的部分就是如何优化代码。当然,最有效的方法通常是高级方法。问题一定要这样解决吗?一定要解决吗?它能否提前解析并缓存结果,以便在应用程序的其余部分需要时立即交付?有没有更有效的算法来解决这个问题?如果您可以应用此类高级优化,请这样做,看看是否能充分提高性能,如果没有,请重新配置。迟早,您可能不得不深入研究较低级别的优化。这是一个棘手的领域。今天的计算机非常复杂,要发挥它们的性能并不简单。分支或函数调用的成本可能因上下文而有很大差异。将两个数字相加可能需要0到100个时钟周期,这取决于这两个值是否已经存在于CPU的寄存器中、当时正在执行什么以及许多其他因素。因此,在此级别进行优化需要(1)充分了解CPU的工作原理,以及(2)进行大量实验和测量。您可以轻松做出您认为会更快的更改,但您需要确定,因此要衡量更改前后的性能。有一些通常可以帮助指导优化的一般经验法则:I/O很昂贵。CPU指令以纳秒的分数来衡量。RAM访问大约为几十到几百纳秒。硬盘访问可能需要数十毫秒。通常,I/O会减慢您的应用程序。您的应用程序是执行少量大I/O读取(读取一个大块中的20MB文件),还是执行大量小块(从一个文件读取2,052到2073字节,然后读取几个字节)?更少的大读取可以将您的I/O速度提高数千倍。页面错误还涉及硬盘访问。内存页面必须被推送到页面文件,并且分页页面必须被读回内存。如果这种情况经常发生,它可能会很慢。您能否改进数据的局部性以便同时需要更少的页面?您可以为主机购买更多RAM以避免必须对数据进行分页吗?(一般来说,硬件很便宜。升级你的电脑是一个非常有效的优化-但要确保升级会有所作为。通过购买更快的电脑,磁盘读取会更快。如果一切都适合你的On较旧的系统,购买8倍RAM的系统没有意义)您的数据库还依赖于硬盘访问。那么能否在RAM中缓存更多数据,只是偶尔将其写入数据库?(当然有风险。如果应用程序崩溃会发生什么?然后是每个人最喜欢的线程。现代CPU提供从2到16个CPU内核的任何地方。你在使用它们吗?你会从中受益吗?没有是否有长期运行的可以异步执行的操作?应用程序在单独的线程中启动操作,然后可以立即恢复正常操作,而不是阻塞直到操作完成。基本上,使用分析器来了解您的应用程序。它如何花费执行时间,它在哪里花了?内存消耗是一个问题吗?I/O模式是什么(硬盘和网络访问,以及任何其他类型的I/O)?CPU是一直在运转,还是在空闲等待一些外部事件,例如I/O或定时器?然后尽可能多地了解它正在运行的计算机。了解它有哪些可用资源(CPU缓存、多核),以及每种资源对性能的意义。这一切都是模糊的,因为这些技术用于优化大型数据库服务器的技术将与您用于优化某些大数运算算法的技术大不相同。我正在上一门本科课程(一个主题是性能分析),推荐的文本是计算机系统的性能分析:实验设计、测量、模拟和建模技术。这是一本关于这个主题的圣经,也许有点矫枉过正。如果您熟悉并已经购买了ANTS(一个非常好的分析器),那么请前往此处获取快速教程以帮助您启动和运行。如果您有VisualStudioTeamSystem,我建议使用它包含的Profiler。它位于“Analyze->Profiler”下使用这个分析器非常简单。你可以偷偷溜进去看看你做了什么。练习比你读过的任何文章或书籍都要好。只需点击几下,即可轻松找到您的第一个瓶颈。解决它们可能会变得更加棘手,但同样,优化代码只是一个问题或实践和经验。阅读RicoMariani的博客。在晋升之前,他是.Net的主要性能调整者。他博客上的旧条目有很多好的建议。我会开始接近并继续前进。那加上您已经找到的文章(尤其是第一篇)应该可以帮助您入门。有分析器和分析工具,但是当你试图寻找/购买/安装/学习一个时,只需尝试一个老式的技巧......在IDE下运行应用程序,当它很慢时,点击“暂停”按钮,询问它在做什么,为什么。回答这个问题的最好方法是阅读调用堆栈。如果它比应该的速度慢几倍,比如10倍,这意味着它花费90%的时间做一些不必要的事情,这就是你发现它这样做的机会。如果你重复多次,你可以尽可能准确地证实你的怀疑。所以你不需要昂贵/流行但模糊的放大镜。所以找到缓慢的原因并不是难事,通常有几个。困难在于,在您修复了一些“低垂的果实”之后,您可能不得不面对这样一个事实,即速度缓慢的主要原因是过度设计。祝你好运。我以前使用过分析器,它们可以提供帮助,但是您可以通过创建一个秒表类型类并“点击”它来获得很多帮助(让它打印出自上次点击以来的时间以及那段时间所花费的时间)在您认为可能有问题的方法之前和之后。如果速度是整个应用程序的一个问题,那么您可能对此无能为力,但您可以进行一些更改……寻找内部循环。这些是性能死亡。内部循环可以包括对链表的简单索引,或对基于数组的列表的插入排序。(有一次我有一个列表框需要10-20分钟来填充数千个条目,尽管有这么多条目,最糟糕的是它通过将每个条目插入到数组列表中来对每个条目进行排序)。看看当你长时间按下一个键时会发生什么。这应该几乎总是在主线程之外完成。甚至不要考虑优化诸如类的数量或它们实例化的频率、字符串连接(在循环之外)、创建变量或任何其他看起来应该有用的愚蠢策略。我已经尝试了一些,当我真正放慢速度时总是觉得自己很愚蠢,因为我不像运行时那么聪明。我会下载一些可用的分析工具(免费试用)并开始使用它们。我用过jetbrains和其他人。(例如,ant、devpartner和MSone?、atomatedqa等)运行它们应该不会有太多问题。他们的报告可为您提供大量信息,您只需使用该应用程序即可快速学习。它们中的任何一个都可能对您有所帮助,并且使用这些试验是很好的。然后你可以放弃购买工具的决定,或者购买最有用/最容易使用的工具。一般来说,它们可以节省时间并且物有所值,尽管有些可能很昂贵。(我很难处理高端工具,因为有真正好的工具而且价格更低)您可能会在安装和运行它们的第一天发现一些严重/重要的性能问题。我知道我做到了。祝你好运。只需下载一些工具并开始运行您的应用程序。编辑:至于书籍和学习-基本上了解代码问题的最佳方法是找到错误的代码。很多时候,与有经验的开发人员核实是很有帮助的。举个例子:我认为Joel写了一篇关于他做类似for(inti=0;我了解软件。尤其是数据结构。除非你先了解它,否则不要开始优化。其次,你应该衡量(这看起来就像你要做的那样。我的直觉几乎总是误导我;我认为第二位是时间。这也意味着当你优化时,你总是在针对你运行的一些测试用例集进行优化优化。选择这种情况很重要。你已经用Profiler击中了头脑。所有这些,至少是我使用过的所有那些,都遵循相同的基本方法。你选择可执行文件,然后运行应用程序.你对输出所做的是找到花费最多时间的方法。这还不是全部,但你正在寻求一种学习如何优化代码的好方法,因此长时间运行的例程是一个很好的起点。默认情况下,您提到的ANTS将显示长时间运行的例程,大多数(如果不是全部)其他例程也是如此。您可以排除容器方法,例如Main(),除非您有很多代码(不太可能)。总的来说,我发现大部分浪费都在三个方面:循环递归网络延迟对于数据库,如果您还对数据库进行概要分析,则通常很容易发现区域#3,因为您会看到命中数。无论是否是数据库(例如服务调用),减少网络延迟的最佳方式是通过消息而不是CRUD进行通信。不要一次查询每个表。不幸的是,这种解决方案通常需要组装公共数据层的许多部分。递归和循环是非常相似的问题。如果你想要降压,请先打内环。在.NET中,您还可以通过学习基本IL和使用Reflector等工具检查应用程序的IL来了解很多有关优化的知识。有点浪费时间,如果它不是您工作描述的主要部分,或者您可能希望在未来的职业生涯中度过的事情。做一名消防员是很昂贵的,但做一个只维护编码员的人可能会很无聊。关于优化和分析.NET应用程序的书籍很少。标题中有所优化的那个。.NET的调试书有一些关于分析的信息,但不是很深。这是一本优化优化的好书,因为许多导致错误的相同问题也可能出现在你的优化行程中。以上就是C#学习教程:学习分析/优化可以使用哪些资源?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: