与C+相关的过早优化和过早悲观+;编码标准 草本萨特的C++编码标准,避免了过早优化< /代码>和过早悲观< /代码>。但我觉得两者都在做同样的事情。因此,希望对澄清这两个概念以及它们之间的区别有所帮助。如果你能举出一些例子,对其他人会更有好处。 这是关于过早优化的一个很好的解释。但是我找不到任何关于过早悲观的解释,我认为他所说的过早悲观与过早优化正好相反:根本不考虑使用哪种数据结构和算法

与C+相关的过早优化和过早悲观+;编码标准 草本萨特的C++编码标准,避免了过早优化< /代码>和过早悲观< /代码>。但我觉得两者都在做同样的事情。因此,希望对澄清这两个概念以及它们之间的区别有所帮助。如果你能举出一些例子,对其他人会更有好处。 这是关于过早优化的一个很好的解释。但是我找不到任何关于过早悲观的解释,我认为他所说的过早悲观与过早优化正好相反:根本不考虑使用哪种数据结构和算法,c++,coding-style,C++,Coding Style,过早优化通常涉及算法的细节,这些细节可以在以后很好地调整,不需要在一开始就加以注意 相比之下,过早的悲观则与代码体系结构的高级设计有关:例如,库的根本效率低下的接口无法通过优化来修复,因为公共界面几乎是一成不变的。我倾向于认为过早悲观只是对性能要求的误解,导致过早的优化。i、 你错误地认为你的代码执行速度不够快,或者使用了太多的资源(悲观主义),所以你在没有必要的地方进行优化 随着越来越多的大型数据集的出现,我倾向于更频繁地看到相反的情况,即缺乏足够的悲观情绪,导致选择无法扩展以满足用户需求的算

过早优化通常涉及算法的细节,这些细节可以在以后很好地调整,不需要在一开始就加以注意


相比之下,过早的悲观则与代码体系结构的高级设计有关:例如,库的根本效率低下的接口无法通过优化来修复,因为公共界面几乎是一成不变的。

我倾向于认为过早悲观只是对性能要求的误解,导致过早的优化。i、 你错误地认为你的代码执行速度不够快,或者使用了太多的资源(悲观主义),所以你在没有必要的地方进行优化


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

编程时,既有小规模的选择,也有大规模的选择

悲观是指当编写代码的方式“妨碍编译器做好工作”时。一个典型的例子是,当函数非常小和简单(例如A{s,g}etter)时,不要将函数放在允许它们内联的位置。这会使函数花费的时间是它应该花费的时间的10倍,而且“正确”非常简单

我在这个网站上发现了一个悲观的说法,就是在“A>>=1”同样合适的情况下使用“A/=2”。如果我们知道
a
不是负数,那么向左移位和除法具有相同的效果,但即使编译器优化除法,它几乎总是生成更多的代码来应对“可能是负数”的情况,并且在某些情况下,额外的代码可能会对性能造成真正的影响

过早的优化是当你展开循环或者仅仅因为你不相信编译器能做好而使代码变得更复杂时——通常没有证据表明它不能做好


另一个例子是“不使用
std::vector
”,而是您自己的
可扩展数组
,因为“vector太慢”,甚至没有使用
std::vector
测试代码

赫伯的意思是,当你面对两个同样可读的选项时,总是选择最有效的一个

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

过早优化是指为了一些甚至不值得的“优化”而牺牲可读性。使用探查器进行此操作

在启用“按引用传递”时定义按值传递参数 适当的

这是避免过早悲观的最简单例子之一。它不需要任何成本,只是成为了第二天性,可以避免一些性能缺陷

假设你指的是这本书——C++编码标准:101条规则、指南和最佳实践。2004年10月ISBN:0321113586-第9项和第25项给出了几个示例:


  • 不要过早地悲观

  • 通过值、(智能)指针或引用适当地获取参数

  • 顺便说一句,克努特是在1974年这样说的。目前,过早优化主要是指不过早地编译发布版本。因为编译器会优化99%的代码(包括程序员所做的优化)。@SChepurin它当然不会。“过早优化”是指在没有确凿证据表明部分代码实际上对性能至关重要的情况下,对部分代码进行优化(例如,编写假定快速的低级代码,可能包括位篡改、内联汇编等)。@SChepurin“过早优化”一词与编译器设置无关。这是关于手动优化代码的。@SChepurin这正是我的观点。“手动优化”代码就是术语“过早优化”所指的。没有在编译设置中打开某些优化标志。@SChepurin,我要说的是,任何人如果真的相信他们可以对当今编程中99%的优化案例进行评论,那就大错特错了。我同意第一段,但我认为你在第二段就错了。用
    a>>1
    替换
    a/2
    恰恰是一种过早的优化,应该留给编译器。编写可读代码。如果你想除以二,就这样做。你可以证明这段代码对性能至关重要,编译器产生的优化代码也不太理想。你看了
    a/2
    a>>1
    之间的区别了吗?你会感到惊讶的。我同意,如果某件事在
    main
    的开头做一次,那就没有什么区别了。但是,仅仅因为一些初学者不能阅读而编写更长的代码也是一个坏主意。如果有人是专业的C/C++程序员,并且不理解
    a>>1
    a/2
    相同(对于正向va