Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以使用哪些资源来学习分析/优化?_C#_.net_Optimization_Profiling - Fatal编程技术网

C# 我可以使用哪些资源来学习分析/优化?

C# 我可以使用哪些资源来学习分析/优化?,c#,.net,optimization,profiling,C#,.net,Optimization,Profiling,我刚刚继承了一个C#项目,它的运行速度很慢,必须开始优化它。我想做的第一件事是学习更多关于分析/优化的知识,因为我以前不必这么做。所以问题是我从哪里开始,我能读什么书/博客/文章 我确实知道像ANTS profiler之类的.net分析器,但我不知道如何有效地使用它们。我还没有真正使用过它,只是让它在一些示例应用程序上运行,以处理输出。如果您熟悉并且已经购买了ANTS(一个非常优秀的分析器),那么请快速阅读教程,让您开始运行。我正在修本科课程(其中一个主题是性能分析),推荐的文本是。这是一本关于

我刚刚继承了一个C#项目,它的运行速度很慢,必须开始优化它。我想做的第一件事是学习更多关于分析/优化的知识,因为我以前不必这么做。所以问题是我从哪里开始,我能读什么书/博客/文章


我确实知道像ANTS profiler之类的.net分析器,但我不知道如何有效地使用它们。我还没有真正使用过它,只是让它在一些示例应用程序上运行,以处理输出。

如果您熟悉并且已经购买了ANTS(一个非常优秀的分析器),那么请快速阅读教程,让您开始运行。

我正在修本科课程(其中一个主题是性能分析),推荐的文本是。这是一本关于这个主题的圣经,可能有点过头了。

这两篇文章是我迄今为止发现的全部内容:


如果您有Visual Studio Team System,我建议使用它包含的探查器。
它位于“分析->探查器”下
使用这个分析器非常简单。你可以直接进去看看你能从中得到什么。动手练习比你要读的任何文章或书都要好


只需单击几下,就可以轻松找到前几个瓶颈。解决这些问题可能有点棘手,但同样,优化代码只是一件事或实践和经验。

优化代码有两个步骤

首先,你需要找出什么是慢的。这就是剖析,而且,正如您可能猜到的,剖析器通常用于此。大多数探查器通常都易于使用。您通过探查器运行应用程序,当它终止时,探查器将显示每个函数花费的时间(独占的(此函数不计算从该函数调用的函数所花费的时间)以及包含的(此函数所花费的时间,包括子函数调用的时间)

换句话说,你有一个大的呼叫树,你只需要寻找大的号码。通常,很少有函数会占用10%以上的执行时间。因此,找到这些,您就知道要优化什么

请注意,探查器既不是必需的,也不一定是最好的方法。一种非常简单但有效的方法是在调试器中运行程序,并在几个准随机时间暂停执行并查看调用堆栈。只要这样做几次,你就会非常清楚你的执行时间花在了哪里@在这个答案下发表评论的Mike Dunlavey在其他地方深入描述了这种方法

但是现在您知道执行时间花在哪里了,接下来是棘手的部分,如何优化代码

当然,最有效的方法通常是高层方法。这个问题一定要这样解决吗?难道一定要解决吗?是否可以提前解决并缓存结果,以便在应用程序的其他部分需要时立即交付? 有没有更有效的算法来解决这个问题

如果您可以应用这样的高级优化,那么就这样做,看看这是否能充分提高性能,如果不能,请重新配置

迟早,您可能不得不进行更多的低级优化。但这是一个棘手的领域。今天的计算机相当复杂,从中获得的性能并不简单。根据上下文的不同,分支或函数调用的成本可能会有很大差异。将两个数字相加可能需要0到100个时钟周期,这取决于这两个值是否已存在于CPU的寄存器中、当时执行的其他内容以及许多其他因素。因此,这一级别的优化需要(1)对CPU的工作方式有很好的理解,(2)大量的实验和测量。你可以很容易地做出一个你认为会更快的改变,但是你需要确定,所以要衡量改变前后的表现

有一些通常的经验法则可以帮助指导优化:

I/O非常昂贵。CPU指令的测量单位为纳秒。RAM访问大约为几十到几百纳秒。硬盘访问可能需要数十毫秒。通常情况下,I/O会使您的应用程序变慢。 您的应用程序执行几个大的I/O读取(在一个大数据块中读取20MB的文件),还是执行无数个小的I/O读取(从一个文件中读取2052到2073字节,然后从另一个文件中读取几个字节)?更少的大型读取可以将I/O速度提高数千倍

页面故障也涉及硬盘访问。内存中的页面必须被推送到页面文件,而分页出来的页面必须读回内存。如果这种情况经常发生,就会很慢。您能否改进数据的位置,以便同时需要更少的页面?你能简单地为主机购买更多的RAM以避免数据分页吗?(一般来说,硬件是便宜的。升级计算机是一种非常有效的优化,但要确保升级会起到作用。购买速度更快的计算机不会加快磁盘读取速度。而且,如果旧系统上的所有东西都适合RAM,那么购买一台RAM为原来系统的8倍的计算机是没有意义的)

您的数据库也依赖于硬盘访问。因此,您可以在RAM中缓存更多的数据,而只是偶尔将其写入数据库吗?(当然存在风险。如果应用程序崩溃怎么办

还有每个人都喜欢的线程。现代CPU有2到16个CPU内核。你都在使用吗?你会从中受益吗?有可以异步执行的长时间运行的操作吗?应用程序在单独的线程中启动操作,然后能够立即恢复正常操作在操作完成之前,不要阻塞,而应立即停止。