优化是使现有的代码更有效地运行的过程(更快的速度,和/或更少的资源使用)
所有优化是为时过早,如果程序员没有证明,这是必要的。 (例如,通过运行代码来确定它是否在可接受的时间范围内实现了正确的结果,这可能非常简单,只要运行它即可“查看”其运行速度是否足够快,或者在分析器下运行以更仔细地进行分析) 。
有几个阶段编程事情做好:
1)设计解决方案和挑好的,高效的算法。
2)以可维护,编码良好的方式实施解决方案。
3)测试解决方案,看它是否满足您对速度,内存使用情况等的要求(例如“当用户点击”保存“时,是否需要少于1秒?”如果需要0.3秒,你真的不需要花费一个星期的时间来优化它,使时间降到0.2秒)
4)IF它不符合要求,考虑为什么。在大多数情况下,这意味着如果您更好地理解问题,则会转到步骤(1)以找到更好的算法。 (写一个快速原型常常是探索这个便宜的好办法)IF它仍然不符合要求,开始考虑优化技术,可以帮助加快运行时(例如,查找表
5),缓存等)。为了推动这个过程,分析通常是一个重要的工具,可以帮助您找到代码中的瓶颈和无效情况,因此您可以在代码上花费最多的时间。
我应该指出,一个经验丰富的程序员在一个相当熟悉的问题上工作,可能能够在思维上跳过第一步,然后应用一个模式,而不是每次都物理地经历这个过程,但这仅仅是一个简单的通过体验获得的快捷方式
因此,有许多经验丰富的程序员将自动构建到代码中的“优化”。这些不是“过早的优化”,而是“常识效率模式”。这些模式是快速和容易实现,但大大提高了代码的效率,你不需要做任何特别的计时测试制定出他们是否会是有益的:
- 没有把不必要的代码循环。 (类似于从现有循环中删除不必要的代码的优化,但它不涉及将代码写两次!)
- 在变量中存储中间结果而不是重复计算一遍又一遍。
- 使用查找表提供预先计算的值,而不是实时计算它们。
- 使用合适大小的数据结构(例如存储在字节的百分比(8位),而不是一个长(64位)将使用较少的8倍RAM)
- 使用预先绘制的图像绘制复杂窗口背景而非抽签单独组分的
- 应用压缩到您打算通过低速连接发送的数据包以最小化带宽使用。
- 为您的网页绘制图像的风格允许您使用高质量和良好压缩格式。
- 当然,虽然它在技术上不是一个“optmisation”,但首先选择正确的算法!
例如,我刚刚在我们的项目中替换了一段旧代码。我的新代码没有以任何方式“优化”,但(与原始实现不同),它的编写效率非常高。结果:矿井运行速度提高25倍 - 只是不浪费。我可以优化它以使其更快吗?是的,我可以轻松获得另一个2倍加速。我会优化我的代码以使其更快吗?没有 - 5倍的速度提升已经足够了,我已经达到了25倍。此时的进一步工作只会浪费宝贵的编程时间。 (但如果需求改变,我可以在将来重新访问代码)
最后,最后一点:您正在使用的区域决定了您必须符合的条。如果您正在为实时嵌入式控制器编写游戏或代码的图形引擎,您可能会发现自己正在进行大量优化。如果您正在编写桌面应用程序(如记事本),则只要不过度浪费,您可能永远不需要优化任何内容。
其他一些您可能会感兴趣的文章:[早熟优化的谬论](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
谢谢你.... – 2011-01-31 05:20:59
看看[这个答案](http://programmers.stackexchange.com/questions/39515/at-what-point-should-you-start-to-think-about-performance/39585 #39585)。 – 2011-01-28 21:46:53