我知道 CPU 分支预测错误的惩罚等,让代码无分支会更快地改进代码。
我试图理解为什么 [1] 中的补丁进行了以下更改,使代码速度提高了 1.5 倍? (对比例如快 1.1 倍)
[1] https://github.com/rust-lang/rust/pull/107894/files
(PR 的作者在 Zen 3 上的速度提高了 1.5 倍,我在 Zen 3(Ryzen 3900x)上的速度稍微提高了)
- if child + 1 < v.len() && is_less(&v[child], &v[child + 1]) {
- child += 1;
+ if child + 1 < v.len() {
+ child += is_less(&v[child], &v[child + 1]) as usize;
}
一些注意事项:
child += 1
里面的if
被翻译成了简单的寄存器间移动。编译器生成的汇编代码在 2 个寄存器中维护 child & child+1。所以在 if
块内没有发生内存访问。我目前对这种剧烈加速的理解是:
[2] https://www.agner.org/optimize/microarchitecture.pdf
我的理解对吗?我错过了什么吗?有没有其他工具可以帮助我了解正在发生的事情的细节?