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