2011-01-28 46 views
6

我看到这个词用了很多,但我觉得大多数人都是懒惰或无知的人使用它。举例来说,我在读这篇文章:什么时候优化过早?

http://blogs.msdn.com/b/ricom/archive/2006/09/07/745085.aspx

,他谈到了他的决定,他使实施必要为自己的应用程序类型。

如果是我,说起这些的,我们需要编写代码,其他程序员会想要么:

  1. 我想太多未来的时候没有什么,从而过早地优化。
  2. 当没有经历减速或性能问题时,过度思考微不足道的细节。

或两者兼而有之。

并建议只是实现它,而不是担心这些,直到他们成为一个问题。

哪个更优惠?

如何在任何实施完成之前区分过早优化和性能关键应用程序的知情决策?

+2

其他一些您可能会感兴趣的文章:[早熟优化的谬论](http://ubiquity.acm.org/article.cfm?id=1513451)和['过早优化是邪恶的'神话](http://www.bluebytesoftware.com/blog/2010/09/06/ThePrematureOptimizationIsEvilMyth.aspx)。 – LukeH 2011-01-29 02:56:38

+0

谢谢你.... – 2011-01-31 05:20:59

+0

看看[这个答案](http://programmers.stackexchange.com/questions/39515/at-what-point-should-you-start-to-think-about-performance/39585 #39585)。 – 2011-01-28 21:46:53

回答

3

不成熟的优化是在代码的某些其他积极属性(例如可读性)的代价下对性能进行优化,然后才知道有必要进行这种折衷。

在开发过程中通常会提前进行优化,而不使用任何分析工具来查找代码中的瓶颈。在很多情况下,优化会使代码更难维护,有时也会增加开发时间,从而增加软件的成本。更糟糕的是......一些过早的优化结果并不是让代码更快,甚至有时甚至会使代码比以前更慢。

1

当您拥有少于10年的编码经验时。

12

优化是早产儿,如果:

  1. 您的应用程序没有做任何事情的时间是至关重要的。 (这意味着,如果你正在编写一个程序,在一个文件中加上500个数字,那么“优化”这个词就不应该流入你的大脑,因为它只会浪费你的时间。)

  2. 你对组件以外的其他事情做了一些时间关键的事情,并且仍然担心i++; i++;是更快还是i += 2 ......如果是确实那么重要,你会在汇编中工作,而不是在浪费时间担心这一点。 (即使这样,这个特例也很重要)

  3. 你有一个hunch有一件事可能比另一件事快一点,但你需要查找它。例如,如果有关于StopWatch是更快还是Environment.TickCount的问题,那么这是过早的优化,因为如果差异更大,那么您可能会更确定并且不需要查看它。

如果你有一个猜测的东西可能是缓慢的,但你也不太清楚,只放了//NOTE: Performance?评论,如果以后遇到瓶颈,在你的代码检查这些地方。我个人不担心优化不太明显;如果需要,我稍后会使用一个分析器。

另一种方法:

我只是运行我的程序,随机与调试闯了进去,看到停止的地方 - 无论它停止可能是一个瓶颈,而更多的时候,它停在那里,就越差瓶颈。它的作用几乎像魔术一样。 :)

1

拥有(很多)经验可能是一个陷阱。我知道许多非常有经验的程序员(C \ C++,程序集)往往担心太多,因为他们习惯于担心时钟滴答和多余的位。

有领域,如嵌入式或实时系统中,这些都计算在内,但在常规的OLTP/LOB应用程式大部分的精力应努力维护性,可读性和changeabilty被引导。

3

当开始了,只是提供一个产品比优化更重要。

随着时间的推移,你会来分析各种应用和将学习编码技能,自然会导致优化的代码。基本上在某些时候,你将能够发现潜在的麻烦点并相应地构建事物。

但是不要在出现实际问题之前出汗。

4

这句谚语不(我认为)是指,因为它创建内置到一个好的设计优化。它指的是专门针对表演的任务,否则将不会进行。

这种优化不会“变成”过早,根据共同智慧—是难脱干系。

1

优化是棘手的。考虑下面的例子:

  1. 决定实施两个服务器,每个服务器都在做自己的工作,而不是实现一个服务器来完成这两个任务。
  2. 出于性能考虑,决定使用一个DBMS而不使用另一个DBMS。
  3. 出于性能原因,决定在存在标准时(例如,在基本上需要标准JPA时使用Hibernate特有的功能)使用特定的非便携API。
  4. 为了性能原因,在汇编中编写了某些东西。
  5. 出于性能原因展开循环。
  6. 写一个非常快速但难懂的代码片段。

我在这里的底线是简单明了。优化是一个广泛的术语。当人们谈论不成熟的优化时,并不意味着你只需要考虑第一件事就可以不考虑完整的图片。他们说你应该:

  1. 集中在80/20规则 - 不考虑所有可能的情况下,但最可能的情况。
  2. 不要过度设计没有任何理由的东西。
  3. 如果没有真正的即时性能问题,请不要编写不清晰,简单且易于维护的代码。

这真的都归结于你的经验。如果你是图像处理方面的专家,并且有人要求你做一些你以前做过十次的事情,那么你可能会从一开始就把所有已知的优化都推上去,但那样会好的。过早优化是指当您不知道需要优化时才尝试优化某些内容。原因很简单 - 这是有风险的,浪费你的时间,而且它不易维护。所以除非你有经验,而且你之前一直在走这条路,否则如果你不知道有问题,不要优化。

1

注意优化是不是免费的(如啤酒)

  • 它需要更多的时间来写
  • 它需要更多的时间来阅读
  • 它需要更多的时间来测试
  • 需要更多的时间优化anyt前调试
  • ...

所以兴,你应该确定它是值得的。

您链接到的Point3D类型看起来像是某件事的基石,并且优化的情况可能很明显。

就像.NET库的创建者在开始优化System.String之前不需要任何测量。尽管如此,他们将不得不进行测量。

但是大多数代码在最终产品的性能中并不扮演重要角色。这意味着优化的任何努力都会浪费。

除此之外,大多数“过早优化”都是未经测试/未测量的黑客行为。

1

如果您在实施的早期阶段花费太多时间进行设计,那么优化还为时过早。在早期阶段,您有更好的事情需要担心:实现核心代码,编写单元测试,系统互相交流,UI以及其他任何事情。优化有一个价格,你可能会浪费时间来优化不需要的东西,而一直在创建难以维护的代码。

只有当您对项目有具体的性能要求时,优化才有意义,然后在初始开发之后性能将很重要,并且您已经有足够的系统来实际测量您需要测量的任何内容。如果不测量,不要优化当你获得更多的经验时,你可以对未来的优化做一些小的设计和实现,也就是说,试着设计一个能够更容易地衡量性能和稍后优化的方法,甚至是必要的。但即使在这种情况下,您也应该在开发的早期阶段花费很少的时间进行优化。

4

优化是使现有的代码更有效地运行的过程(更快的速度,和/或更少的资源使用)

所有优化是为时过早,如果程序员没有证明,这是必要的。 (例如,通过运行代码来确定它是否在可接受的时间范围内实现了正确的结果,这可能非常简单,只要运行它即可“查看”其运行速度是否足够快,或者在分析器下运行以更仔细地进行分析) 。

有几个阶段编程事情做好:

1)设计解决方案和挑好的,高效的算法

2)以可维护,编码良好的方式实施解决方案。

3)测试解决方案,看它是否满足您对速度,内存使用情况等的要求(例如“当用户点击”保存“时,是否需要少于1秒?”如果需要0.3秒,你真的不需要花费一个星期的时间来优化它,使时间降到0.2秒)

4)IF它不符合要求,考虑为什么。在大多数情况下,这意味着如果您更好地理解问题,则会转到步骤(1)以找到更好的算法。 (写一个快速原型常常是探索这个便宜的好办法)IF它仍然不符合要求,开始考虑优化技术,可以帮助加快运行时(例如,查找表

5),缓存等)。为了推动这个过程,分析通常是一个重要的工具,可以帮助您找到代码中的瓶颈和无效情况,因此您可以在代码上花费最多的时间。

我应该指出,一个经验丰富的程序员在一个相当熟悉的问题上工作,可能能够在思维上跳过第一步,然后应用一个模式,而不是每次都物理地经历这个过程,但这仅仅是一个简单的通过体验获得的快捷方式

因此,有许多经验丰富的程序员将自动构建到代码中的“优化”。这些不是“过早的优化”,而是“常识效率模式”。这些模式是快速和容易实现,但大大提高了代码的效率,你不需要做任何特别的计时测试制定出他们是否会是有益的:

  • 没有把不必要的代码循环。 (类似于从现有循环中删除不必要的代码的优化,但它不涉及将代码写两次!)
  • 在变量中存储中间结果而不是重复计算一遍又一遍。
  • 使用查找表提供预先计算的值,而不是实时计算它们。
  • 使用合适大小的数据结构(例如存储在字节的百分比(8位),而不是一个长(64位)将使用较少的8倍RAM)
  • 使用预先绘制的图像绘制复杂窗口背景而非抽签单独组分的
  • 应用压缩到您打算通过低速连接发送的数据包以最小化带宽使用。
  • 为您的网页绘制图像的风格允许您使用高质量和良好压缩格式。
  • 当然,虽然它在技术上不是一个“optmisation”,但首先选择正确的算法!

例如,我刚刚在我们的项目中替换了一段旧代码。我的新代码没有以任何方式“优化”,但(与原始实现不同),它的编写效率非常高。结果:矿井运行速度提高25倍 - 只是不浪费。我可以优化它以使其更快吗?是的,我可以轻松获得另一个2倍加速。我会优化我的代码以使其更快吗?没有 - 5倍的速度提升已经足够了,我已经达到了25倍。此时的进一步工作只会浪费宝贵的编程时间。 (但如果需求改变,我可以在将来重新访问代码)

最后,最后一点:您正在使用的区域决定了您必须符合的条。如果您正在为实时嵌入式控制器编写游戏或代码的图形引擎,您可能会发现自己正在进行大量优化。如果您正在编写桌面应用程序(如记事本),则只要不过度浪费,您可能永远不需要优化任何内容。

相关问题