c++的优化技术

Optimization Techniques for C++

本文关键字:技术 优化 c++      更新时间:2023-10-16

在几天前的Facebook演讲中,Andrei Alexandrescu谈到了可能证明我们错误的常见直觉。对我来说,幻灯片7上有一个非常有趣的观点,他说假设"更少的指令=更快的代码"是不正确的,更多的指令并不一定意味着更慢的代码。

我的问题来了:他的演讲的音频质量(大约6:20分钟)不是很好,我不太理解解释,但从我得到的是,他是比较退役指令和性能水平上算法的最优性。

然而,根据我的理解,这是不可能做到的,因为这是两个独立的结构层次。指令(特别是实际上已退役的指令)是一个非常重要的度量,基本上,它让您了解实现目标的性能。如果我们不考虑指令的延迟,我们可以概括为更少的退役指令=更快的代码。当然,有些情况下,在循环中执行复杂计算的算法会产生更好的性能,即使它是在循环中执行的,因为它会更早地中断循环(想想图遍历)。但是,在复杂程度上比较算法,而不是说这个循环有更多的指令,比另一个更好,不是更有用吗?从我的角度来看,更好的算法最终会有更少的退役指令。

有人能帮我理解他的例子在哪里,以及如何在(显着)更多退役指令导致更好的性能的情况下?

质量确实很差,但我认为他导致了这样一个事实,即CPU很适合计算,但在内存寻道(RAM比CPU慢得多)和分支(因为CPU作为管道工作,分支可能导致管道中断)方面表现不佳。

下面是一些指令越多越快的例子:

  1. 分支预测 -即使我们需要做更多的指令,但它会导致更好的分支预测,CPU的管道将被更多的时间填满,并且更少的操作将被"抛出",最终导致更好的性能。例如,这个线程展示了如何做同样的事情,但首先排序-提高性能。

  2. CPU Cache -如果你的代码是缓存优化,并遵循局部性的原则-它更有可能比没有的代码更快,即使代码没有执行一半的指令量。这个线程给出了一个小缓存优化的例子——如果没有缓存优化,相同数量的指令可能会导致代码变慢。

  3. 执行哪些指令也很重要。有时-某些指令可能比其他指令执行得慢,例如- 除法可能比整数加法慢。

注意:以上所有这些都是与机器相关的,它们实际上如何/是否改变性能可能因架构而异。

指令的数量本身并不是一个很好的衡量标准。

更少的退役指令(因为没有更多的事情要做)=更快的代码。

更少的退役指令(因为它们必须等待依赖项)=更慢的代码。

有时代码中更多的指令也意味着更多的退役指令,因为它们会占用执行槽,否则在情况2中会浪费掉。