我尽量只在确认存在性能问题时才进行优化。
我对过早优化的定义是“在代码未被证明存在性能问题时浪费精力进行的优化”。当然,优化有其适用的时间和地点。然而,关键在于只在应用程序性能需要并且额外成本超过性能损失的情况下才花费额外成本。
编写代码(或数据库查询)时,我努力编写“高效”的代码(即执行其预期功能,具有尽可能简单的逻辑,并快速完整)。请注意,“高效”的代码不一定与“优化”的代码相同。优化通常会在代码中引入额外的复杂性,增加该代码的开发和维护成本。
我的建议:只有在您能够量化收益时才支付优化成本。
Norman的回答非常好。有些“过早优化”实际上是最佳实践,因为否则将完全低效。
例如,补充一下Norman的列表:
for(i = 0; i < strlen(str); i ++)
(因为strlen在每次循环中都需要调用字符串查找函数);for(i = 0 l = str.length; i < l; i ++)
更快,并且仍然可读,所以可以采用。诸如此类的微小优化永远不应以代码的可读性为代价。
只有在极端情况下才需要使用分析器。项目的工程师应该知道性能瓶颈出现在哪里。
我认为“过早优化”非常主观。
如果我正在编写一些代码,我知道我应该使用Hashtable,那么我会这样做。我不会以某种有缺陷的方式实现它,然后等待一个月或一年后收到错误报告,当有人遇到问题时。
重新设计比从一开始就以明显的方式优化设计更加昂贵。
显然,第一次可能会错过一些小事情,但这些很少是关键的设计决策。
因此:我认为不优化设计本身就是代码异味。
goto
作为消除热点的一种方式。他的引用是一个警告,他添加了这个理由来证明他使用goto
加速关键循环的合理性。goto
]并不难学习,正如我所说,它们只适用于程序的一小部分,但通常会带来可观的节省。[...]"goto
语句]。对我而言,过早地进行优化意味着在你拥有一个可工作的系统之前,试图提高代码的效率,并且在你实际上对其进行分析并知道瓶颈在哪里之前。即使在此之后,在许多情况下,可读性和可维护性也应该优先于优化。
我认为被广泛认可的最佳实践不是过早优化。这更多地涉及到在可能存在性能问题的使用场景中浪费时间研究“如果”条件。一个很好的例子是:如果你在没有证据表明反射操作是一个瓶颈之前,花费一周时间优化反射操作,那么你就是过早地进行了优化。
除非你发现你的应用程序需要更高的性能,这可能是由于用户或业务需求,否则没有必要担心优化。即使那样,也不要在对代码进行分析之前就开始做任何事情。然后攻击花费最多时间的部分。
正如我在类似问题中发布的那样,优化的规则是:
1)不要优化
2)(仅限专家)稍后再进行优化
什么时候进行优化过早?通常情况下。
例外情况可能出现在您的设计中,或者在使用频率很高的封装良好的代码中。过去,我曾经处理过一些时间关键的代码(RSA实现),在查看编译器生成的汇编代码并删除内部循环中的单个不必要指令后,速度提升了30%。但是,使用更复杂的算法带来的加速比这还要高几个数量级。
另一个在优化时要问自己的问题是“我是否在进行等同于为300波特调制解调器进行优化?”换句话说,在摩尔定律使您的优化变得无关紧要之前,您的优化是否仍然有效。许多扩展问题可以通过投入更多硬件来解决。
最后但并非最不重要的是,在程序运行缓慢之前进行优化是过早的。如果您正在谈论的是Web应用程序,则可以在负载下运行它以查看瓶颈所在-但很可能您将遇到与大多数其他站点相同的扩展问题,并且相同的解决方案也适用。
编辑:顺便提一下,关于链接的文章,我对其中许多假设表示怀疑。首先,摩尔定律在90年代停止工作并不是真的。其次,用户的时间比程序员的时间更有价值并不明显。大多数用户(至少可以这么说)并没有疯狂地使用每个可用的CPU周期,他们可能正在等待网络完成某些操作。此外,当程序员的时间从实现其他功能转移到削减程序在用户通话时执行的某些操作的几毫秒时,就会存在机会成本。超过这个时间的任何优化通常都不是优化,而是修复错误。