提高C#代码效率的方法

时间:2010-07-11 15:59:59

标签: c# optimization performance complexity-theory

像我们大多数人一样,我是提高代码效率的忠实粉丝。这么多,我宁愿选择快速执行的脏代码而不是更优雅或更干净但更慢的东西。

幸运的是,对于我们所有人来说,在大多数情况下,更快更有效的解决方案也更清洁,更优雅。我曾经只是编程的一个讨厌的人,但我现在正在进行全职开发,刚开始使用C#和Web开发。我一直在阅读一些关于这些主题的好书,但遗憾的是,书籍很少涉及更精细的方面。比方说,执行相同操作的两个代码中的哪一个会运行得更快。这种知识主要来自经验。我请求所有程序员在这里分享任何这样的知识。

在这里,我将从我遇到的这两篇博文开始。这正是我在这篇文章中寻找的东西:

P.S:如果这个东西已经存在于这个网站的某个地方,请告诉我。我惊讶地搜索但找不到。另外,请发布您知道的任何涵盖此类内容的书。

P.P.S:如果您从某些博客文章或我们都可以访问的某些在线资源中了解某些内容,那么最好发布链接本身imo。

9 个答案:

答案 0 :(得分:16)

您应该做一些事情,比如使用泛型而不是对象来避免装箱/拆箱并提高代码安全性,但优化代码的最佳方法是使用分析器来确定代码的哪些部分很慢。有许多可用于.NET代码的优秀分析器,它们可以帮助确定程序中的瓶颈。

通常,您不应该关注提高代码效率的小方法,而是在完成编码时,然后对其进行分析以找出瓶颈。

一个好的分析器会告诉你一些功能执行的次数,功能的平均运行时间,功能的峰值运行时间,功能的总运行时间等等。有些分析器甚至会为你绘制图形,这样你就可以直观地看到程序的哪些部分是最大的瓶颈,你可以深入研究子函数调用。

如果没有分析,你很可能会错误地认为程序的哪一部分很慢。

.NET的优秀和免费分析器的一个例子是EQATEC Profiler

答案 1 :(得分:8)

关于这个问题,最重要的一点是:不要过早优化!

只有一个优化时间,即存在当前工作实施无法满足的性能限制时。然后你应该拿出一个分析器,检查代码的哪些部分很慢,以及如何解决它们。

在编写第一个版本时考虑优化主要是浪费时间和精力。

答案 2 :(得分:6)

“我宁愿选择快速执行的脏代码,而不是更优雅或更干净,但速度更慢。”

如果我正在为游戏编写一个像素渲染器,或许我会考虑这样做 - 但是,当回应用户点击某个按钮时,我总是喜欢慢速,优雅的方法而不是快速 - 肮脏的(除非慢,>几秒钟,我可能会重新考虑)。

我必须同意其他帖子 - 个人资料,以确定你的慢点在哪里,然后处理这些。从一开始就编写最佳代码比它的价值更麻烦,你通常会发现你认为慢的东西会很好,真正的慢速区域会给你带来惊喜。

答案 3 :(得分:3)

与.net相关的效果信息的一个很好的资源是Rico Mariani's Blog

答案 4 :(得分:2)

IMO对于所有编程平台/语言来说都是一样的,你必须使用分析器并查看部分代码是否缓慢,然后对这些部分进行优化。

虽然您提供的这些链接是有价值的内容,但不提前做这些事情,先测量然后优化。

编辑:

http://www.codinghorror.com/blog/2009/01/the-sad-tragedy-of-micro-optimization-theater.html

When to use StringBuilder?

At what point does using a StringBuilder become insignificant or an overhead?

答案 5 :(得分:2)

有很多技巧,但如果这是你认为需要的,你需要重新开始。任何语言表现的秘诀都不在于编码技术,而是在找到优化的内容

打个比方,如果你是一名警察侦探,而你想把劫匪关进监狱,那么你的事业的核心并不是关于不同类型的监狱。它是关于找到劫匪

我依靠纯粹的手动分析方法。 This is an example找到一系列优化点,导致 43次的加速倍数。

如果您在现有应用程序上执行此操作,您可能会发现性能低下的主要原因是过度使用数据结构设计,导致过多的通知式一致性维护,其特点是过于浓密的调用树。你需要在调用树中找到花费很多并且你可以修剪的调用。

完成后,您可能会意识到设计使用最少数据结构和抽象的软件的方式将会更快开始。

答案 6 :(得分:0)

如果您已经对代码进行了分析,并发现它缺乏快速性,那么您可以使用一些微优化。这是一个short list

明智地微观优化 - 就像哈利波特的镜子一样:如果你不小心,你将把所有的时间都花在那里,如果没有得到很多回报,就不会做任何其他事情。

StringBuilder和异常抛出示例很好 - 这些是我以前犯过的错误,有时会将 seconds 添加到函数执行中。在进行性能分析时,我发现我个人用了很多周期而只是找到的东西。在这种情况下,我使用哈希表(或字典)缓存经常访问的对象。

答案 7 :(得分:0)

良好的程序架构比优化的功能提供了更好的优化 最优化的是避免运行时代码中的所有if else,将它们全部放在初始化时间 总的来说,优化是个坏主意,因为最有价值的是可读程序,而不是快速程序。

答案 8 :(得分:0)

http://www.techgalaxy.net/Docs/Dev/5ways.htm有一些非常好的观点......今天就碰到了它。