优化是使现有的代码更加高效(更快速、资源使用更少)的过程。
所有优化都是不成熟的,如果程序员没有证明它是必要的。(例如,通过运行代码来确定它是否在可接受的时间内实现了正确的结果。这可以简单地运行它以“看”它是否运行得足够快,或者在性能分析器下进行更仔细的分析)。
编写良好的程序有几个阶段:
1)设计解决方案并选择一个好的高效算法。
2)以可维护的方式实现解决方案。
3)测试解决方案,并查看它是否满足您对速度、RAM使用等的要求。(例如,“当用户点击“保存”时,需要少于1秒吗?” 如果需要 0.3 秒,那么您真的不需要花一周的时间来优化它,使时间降到 0.2 秒)
4)IF 它不符合要求,则考虑原因。在大多数情况下,这意味着转到第(1)步,现在您更好地了解了问题,以找到更好的算法。(编写一个快速的原型通常是探索这个过程的一种廉价方法)
5)IF 它仍然不符合要求,则开始考虑可能有助于加速运行时的优化(例如查找表、缓存等)。为了推动这个过程,性能分析通常是一个重要的工具,帮助您定位代码中的瓶颈和低效之处,以便您可以在编码上花费的时间中获得最大的收益。
我应该指出,一个经验丰富的程序员在处理一个相对熟悉的问题时,可能能够在头脑中跳过第一步,然后只是应用模式,而不是每次都亲自完成这个过程,但这只是通过经验获得的一种捷径。
因此,有许多“优化”是经验丰富的程序员会自动构建到他们的代码中。这些不是“过早优化”,而是“常识效率模式”。这些模式很快、易于实现,但极大地提高了代码的效率,您无需进行任何特殊的定时测试来确定它们是否有益:
- 不要在循环中添加不必要的代码。(类似于从现有循环中删除不必要的代码的优化,但不涉及编写两次代码!)
- 将中间结果存储在变量中,而不是一遍又一遍地重新计算。
- 使用查找表提供预先计算的值,而不是即时计算它们。
- 使用适当大小的数据结构(例如,在字节(8位)中存储百分比而不是长整型(64位)将使用少8倍的RAM)
- 使用预绘制图像绘制复杂窗口背景,而不是绘制许多单独的组件
- 对打算通过低速连接发送的数据包应用压缩以最小化带宽使用。
- 以允许使用高质量和良好压缩格式的样式为您的网页绘制图像。
- 当然,虽然这不是“优化”,但首先选择正确的算法!
例如,我刚刚替换了我们项目中的旧代码。我的新代码没有任何“优化”,但是(与原始实现不同),它是以效率为前提编写的。结果:我的代码运行速度快了25倍 - 只是因为不浪费。我可以优化它使它更快吗?是的,我可以轻松地获得另外2倍的速度提升。我会优化我的代码使它更快吗?不会 - 5倍的速度提升已经足够了,而且我已经实现了25倍的速度提升。此时进一步的工作只会浪费宝贵的编程时间。(但如果需求变化,我可以在未来重新审视代码)
最后,最后一个要点:您所工作的领域决定了您必须达到的标准。如果您正在为游戏编写图形引擎或实时嵌入式控制器编写代码,则可能需要进行大量优化。如果您正在编写像记事本这样的桌面应用程序,则只要不过度浪费,就可能永远不需要优化任何内容。