Donald Knuth发起了文学编程运动,因为他认为计算机代码最重要的功能是向人类读者传达程序员的意图。任何以性能为名义使您的代码难以理解的编码实践都是过早的优化。
一些被引入为了优化而产生的习惯用法变得非常流行,以至于每个人都能理解它们,它们已经不再是过早的优化了。例如:
在C语言中使用指针算术运算而不是数组记号,包括使用这种惯用语的示例
for (p = q; p < lim; p++)
在Lua中重新绑定全局变量为局部变量,例如: local table, io, string, math
= table, io, string, math
在这些习语之外,冒险采用捷径可能会带来风险。
除非
程序运行缓慢(许多人忽略了这一点)。
您已经有了一个测量数据(如分析报告等),表明该优化可以改善性能。
(也可以为内存进行优化。)
直接回答问题:
编辑:针对评论,使用快速排序而不是插入排序之类的简单算法是每个人都理解和预期的另一个习惯用法。(尽管如果你编写自己的排序例程而不是使用库排序例程,希望你有一个非常好的理由。)
我的看法是,在设计阶段,应基于当前和更重要的未来需求进行90%的优化。如果您必须使用分析器,因为您的应用程序无法承受所需的负载,那么您已经太迟了,并且我认为这将浪费大量时间和精力,同时无法解决问题。
通常情况下,值得进行的唯一优化是在速度方面获得一个数量级的性能提升,或者在存储或带宽方面获得一个乘数。这些类型的优化通常涉及算法选择和存储策略,并且极难反转到现有代码中。它们可能甚至会影响您实现系统所用语言的决策。
因此,我的建议是根据您的需求而不是您的代码尽早优化,并考虑您的应用程序可能的延长寿命。
while (s[0]==' ') s = s.substring(1)
for(i=0; i<s.len && s[i]==' '; ++i); s=s.substring(i)
--- 但这需要已经知道潜在的性能问题(分析器是不断学习的有价值工具)。 - peterchen关于避免过早优化的整个概念,我看到的问题在于言行不一。
我做过很多性能调优,在本来设计良好的代码中挤出了大量的性能,似乎没有进行过过早的优化。 这里有一个例子。
几乎每种情况下,导致次优性能的原因是我称之为泛泛而谈的使用抽象的多层类和彻底面向对象的设计,而简单的概念将会更少(不如说是更加朴素),但完全足够。
而在教授这些抽象设计概念的教材上,例如通知驱动架构和信息隐藏,其中仅设置对象的布尔属性就可以产生无限级联效应的情况下,给出的理由是什么?效率。
那么,这是过早优化还是不是呢?
首先,让代码正常运行。其次,验证代码正确性。第三,使其更快。
在第三阶段之前做任何代码更改都是过早的。我不确定如何对在此之前做出的设计选择进行分类(例如使用适合的数据结构),但我更喜欢使用易于编程的抽象化,而不是那些性能良好的,直到我可以开始使用分析和具有正确(虽然通常很慢)的参考实现来比较结果的阶段。