c++的优化技术
Optimization Techniques for C++
在几天前的Facebook演讲中,Andrei Alexandrescu谈到了可能证明我们错误的常见直觉。对我来说,幻灯片7上有一个非常有趣的观点,他说假设"更少的指令=更快的代码"是不正确的,更多的指令并不一定意味着更慢的代码。
我的问题来了:他的演讲的音频质量(大约6:20分钟)不是很好,我不太理解解释,但从我得到的是,他是比较退役指令和性能水平上算法的最优性。
然而,根据我的理解,这是不可能做到的,因为这是两个独立的结构层次。指令(特别是实际上已退役的指令)是一个非常重要的度量,基本上,它让您了解实现目标的性能。如果我们不考虑指令的延迟,我们可以概括为更少的退役指令=更快的代码。当然,有些情况下,在循环中执行复杂计算的算法会产生更好的性能,即使它是在循环中执行的,因为它会更早地中断循环(想想图遍历)。但是,在复杂程度上比较算法,而不是说这个循环有更多的指令,比另一个更好,不是更有用吗?从我的角度来看,更好的算法最终会有更少的退役指令。
有人能帮我理解他的例子在哪里,以及如何在(显着)更多退役指令导致更好的性能的情况下?
质量确实很差,但我认为他导致了这样一个事实,即CPU很适合计算,但在内存寻道(RAM比CPU慢得多)和分支(因为CPU作为管道工作,分支可能导致管道中断)方面表现不佳。
下面是一些指令越多越快的例子:
-
分支预测 -即使我们需要做更多的指令,但它会导致更好的分支预测,CPU的管道将被更多的时间填满,并且更少的操作将被"抛出",最终导致更好的性能。例如,这个线程展示了如何做同样的事情,但首先排序-提高性能。
-
CPU Cache -如果你的代码是缓存优化,并遵循局部性的原则-它更有可能比没有的代码更快,即使代码没有执行一半的指令量。这个线程给出了一个小缓存优化的例子——如果没有缓存优化,相同数量的指令可能会导致代码变慢。
-
执行哪些指令也很重要。有时-某些指令可能比其他指令执行得慢,例如- 除法可能比整数加法慢。
注意:以上所有这些都是与机器相关的,它们实际上如何/是否改变性能可能因架构而异。
指令的数量本身并不是一个很好的衡量标准。
更少的退役指令(因为没有更多的事情要做)=更快的代码。
更少的退役指令(因为它们必须等待依赖项)=更慢的代码。
有时代码中更多的指令也意味着更多的退役指令,因为它们会占用执行槽,否则在情况2中会浪费掉。
- 空基优化子对象的地址
- 关闭||运算符优化
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 返回值优化:显式移动还是隐式
- 人脸跟踪arduino代码的优化
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 纯函数,为什么没有优化
- 为什么大多数 pair 实现默认不使用压缩(空基优化)?
- 如何以优化的方式同时迭代两个间距不相等的数组
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 小字符串优化(调试与发布模式)
- 浮点定向舍入和优化
- 在 Windows 8/10 技术中完全实时的屏幕捕获,没有延迟
- C++ 关于指针取消引用的技术问题
- Visual Studio 调试优化如何工作?
- 是否有技术原因阻止 Java 中的 final C++ 像 const 一样严格?
- 为什么开关的优化方式与 c/c++ 中的链接不同?
- 线性优化目标函数中的绝对值
- 这种优化技术的名称是什么
- c++的优化技术