0x1 硬件的体系结构
0x2 cpu流水线
原理
cpu每执行一条指令大致至少需要经过以下三个时钟周期:
- 取指令
- 译码
- 执行
(注:现代cpu的流水线其实更加复杂,一般在10几级)
那么很显然如果指令是一条条执行的,会出现等待的情况,指令译码阶段,这个时候取指令模块就得等待,不然后面就出错了。而且由于每一条指令的执行速度均不一致,比如加法和浮点运算显然有质的区别,如果一条条执行,显然后面的指令需要等待前面指令结束。因此现代cpu为了提高性能都是流水线执行,即每一条指令分为多个阶段,每个阶段并行执行。
影响
- 性能
- 分支预测:对于具有高度可预测性的控制流,流水线能保持在满的状态。但是对于难以预测的控制逻辑,流水线需要停顿等待(等待取指令,内存访问较慢),或者需要冲刷之前超前计算的结果(之前的结果可能保存到了寄存器)。
- 代码中有许多循环,且循环计数很小
- 代码中有很多分支,跳转比较远
- 分支预测:对于具有高度可预测性的控制流,流水线能保持在满的状态。但是对于难以预测的控制逻辑,流水线需要停顿等待(等待取指令,内存访问较慢),或者需要冲刷之前超前计算的结果(之前的结果可能保存到了寄存器)。
分支预测通常需要程序员根据业务逻辑辅助cpu进行预测。
- 逻辑性
由于流水线的存在,导致代码的执行顺序可能发生变化
0x3 内存引用
内存引用即通过指针访问内存(随机内存访问)。
由于普通的RAM访问速度比较慢,因此现在的cpu里面一般会集成高速缓存,随机内存访问会导致缓存命中率下降,从而导致cpu性能下降。常见的内存访问比如链表。
struct list {struct list *prev;struct list *next;}
0x4 原子操作
原子操作依赖于cpu提供的lock指令,该指令需要锁住内存总线,从而导致其他的cpu性能下降。
