过早优化和过早的悲观化与C ++编码标准有关

时间:2013-04-08 09:06:47

标签: c++ coding-style

Herb Sutter的 C ++编码标准表示要避免使用Premature optimizationPremature pessimization。但我觉得两者都在做同样的事情。所以期待一些帮助,以澄清这两个概念与它们之间的不同。如果你想出一些例子,那对其他人来说会更有好处。 Here是关于Premature optimization的一个很好的解释。但我找不到任何Premature pessimization

5 个答案:

答案 0 :(得分:19)

我认为,过早的悲观化意味着它与早熟优化相反:基本无视使用哪种数据结构和算法。

过早优化通常与算法的细节有关,这些算法可以在以后调整,不需要在开始时注意。

相比之下,过早的悲观情绪与代码体系结构的高级设计有关:例如,对于您的库来说,基本上效率低下的界面无法通过优化来解决,因为公共界面几乎是一成不变的。

答案 1 :(得分:7)

Herb的意思是,当您面对两个同样可读的选项时,请始终选择最有效的选项。

使用std::vector::reserve()或最佳标准容器或算法并非过早优化。但是,不使用它们将是过早的悲观

过早优化是指为了某些优化而牺牲可读性的时候#34;这甚至可能不值得。使用分析器。

答案 2 :(得分:2)

编程时要做出小规模和大规模的选择。

悲观化是指以“阻止编译器做好”的方式编写代码。一个典型的例子是当函数非常小而且简单时(例如,{s,g} etter),不要将函数放在允许它们内联的位置。这可以使函数占用它应该花费的时间的10倍,并且“正确”这是一件非常简单的事情。

我在本网站上发现的一次悲观情绪是使用“a / = 2;”当“a>> = 1”同样适合时。如果我们知道a不是负数,那么左移和除法具有相同的效果,但即使编译器正在优化除法,它几乎总是产生更多的代码来应对“它可能是负面”的情况 - 在某些情况下,额外的代码可能会成为真正的性能。

过早优化是指当您展开循环或以其他方式使代码更复杂时,因为您不相信编译器做得很好 - 通常没有证据表明它不会做得很好。

另一个示例是“不使用std::vector”,而是您自己的expandable array因为“向量太慢”,甚至没有使用std::vector测试代码。

答案 3 :(得分:0)

我倾向于认为过早的悲观化只是对性能要求的错误解释导致过早的优化。即您错误地认为您的代码执行速度不够快或使用太多资源(悲观),因此您可以优化不必要的地方。

随着越来越多的大型数据集的出现,我倾向于更频繁地反转,即缺乏足够的悲观情绪导致选择无法扩展以满足用户需求的算法。这通常伴随着这样一种信念,即编译器优化是某种不良算法选择的替代品。

答案 4 :(得分:0)

在按引用传递时定义按值传递参数 合适

是避免过早悲观的最简单的例子之一。它不花一分钱,而成为第二天性,可以节省一些性能陷阱。

假设您正在参考这本书- C ++编码标准:101条规则,指南和最佳实践。 2004年10月ISBN:0321113586 -项目9和25给出了一些示例:


  1. 不要过早地悲观

  1. 通过值,(智能)指针或引用适当地获取参数