Optimization 什么时候优化还为时过早?

Optimization 什么时候优化还为时过早?,optimization,premature-optimization,Optimization,Premature Optimization,正如Knuth所说 我们应该忘记小效率,比如说97%的时间:过早优化是万恶之源 这是在堆栈溢出中经常出现的问题,如“哪种是最有效的循环机制”、“SQL优化技术?”()。这些优化技巧问题的标准答案是首先分析代码,看看它是否是问题,如果不是,那么就不需要新技术 我的问题是,如果某个特定的技术是不同的,但不是特别模糊,这真的可以被认为是过早的优化吗 这是兰德尔·海德的一篇相关文章,名为 我的问题是,如果 技术是不同的,但不是 特别模糊或模糊不清, 这真的可以被认为是一个错误吗 过早优化 嗯。。。因此,

正如Knuth所说


我们应该忘记小效率,比如说97%的时间:过早优化是万恶之源

这是在堆栈溢出中经常出现的问题,如“哪种是最有效的循环机制”、“SQL优化技术?”()。这些优化技巧问题的标准答案是首先分析代码,看看它是否是问题,如果不是,那么就不需要新技术

我的问题是,如果某个特定的技术是不同的,但不是特别模糊,这真的可以被认为是过早的优化吗

这是兰德尔·海德的一篇相关文章,名为

我的问题是,如果 技术是不同的,但不是 特别模糊或模糊不清, 这真的可以被认为是一个错误吗 过早优化

嗯。。。因此,您手头有两种技术,成本相同(使用、阅读和修改的工作量相同),其中一种效率更高。不,在这种情况下,使用效率更高的方法不会为时过早


中断您的代码编写以寻找通用编程结构/库例程的替代方案,即使您知道,您正在编写的代码的相对速度实际上并不重要,但很可能会有一个更高效的版本挂在某个地方。。。那还为时过早

格言的要点是,通常情况下,优化是错综复杂的。通常,架构师/设计师/程序员/维护人员需要清晰简洁的代码来理解正在发生的事情


如果一个特定的优化是清晰和简洁的,可以自由地进行实验(但一定要回去检查优化是否有效)。关键是在整个开发过程中保持代码的清晰和简洁,直到性能的好处超过编写和维护优化的成本。

对我来说,过早的优化意味着在拥有一个工作系统之前尝试提高代码的效率,在您实际分析它并知道瓶颈在哪里之前。即使在这之后,在许多情况下,可读性和可维护性也应该在优化之前

Don Knuth发起这项运动是因为他相信计算机代码最重要的功能是将程序员的意图传达给人类读者。任何以性能为名使代码更难理解的编码实践都是过早的优化

以优化的名义引入的某些习惯用法已经变得如此流行,以至于每个人都理解它们,而且它们已经成为人们所期待的,而不是过早的。例子包括

  • 在C语言中使用指针算法代替数组表示法,包括使用

    for (p = q; p < lim; p++)
    
除了这些习语之外,走捷径,后果自负

所有优化都是过早的,除非

  • 程序太慢了(很多人忘记了这一部分)

  • 您有一个测量值(配置文件或类似文件),表明优化可以改善情况

(还允许对内存进行优化。)

对问题的直接答复:

  • 如果您的“不同”技术使程序更难理解,那么这是一个过早的优化


编辑:作为对评论的回应,使用快速排序而不是插入排序等更简单的算法这一大家都理解和期待的习惯用法的另一个例子。(虽然如果您编写自己的排序例程而不是使用库排序例程,希望您有一个很好的理由。)

我不认为公认的最佳实践是过早的优化。更多的是关于燃烧时间的假设,根据使用场景,假设是潜在的性能问题。一个很好的例子:如果你在证明某个对象是一个瓶颈之前,花了一周的时间试图优化该对象的反射,那么你就过早地进行了优化。

如果你没有分析,那就过早了

在我看来,如果您在不知道在不同场景中可以获得多少性能的情况下优化某些内容,那么这是一种过早的优化。代码的目标应该是让人们更容易阅读。

我只会在性能问题得到确认时进行优化

我对过早优化的定义是“浪费在不存在性能问题的代码上的精力”。优化肯定是有时间和地点的。然而,诀窍是只在对应用程序的性能有影响的地方,以及在额外成本超过性能影响的地方,才花费额外成本

在编写代码(或DB查询)时,我会努力编写“高效”代码(即以最简单合理的逻辑快速、完整地执行其预期功能的代码)。请注意,“高效”代码不一定与“优化”代码相同。优化通常会增加代码的复杂性,从而增加代码的开发和维护成本


我的建议是:当你可以量化收益时,试着只支付优化的成本。

除非你发现由于用户或业务需要,你的应用程序需要更高的性能,否则没有理由担心优化。即使这样,在分析代码之前也不要做任何事情。然后攻击耗时最多的部分。

诺曼的回答非常好。不知何故,您通常会进行一些“过早优化”,这实际上是最佳实践,因为如果不这样做,则效率会非常低

例如,要添加到诺曼的列表中:

  • 使用StringBuilder公司
    local table, io, string, math
        = table, io, string, math