Hum*_*awi 5 c++ branch-prediction
从优化和分支预测器的角度来看,这两个代码之间有什么区别吗?
第一:
void think_and_do(){
if(expression){
//Set_A of instructions
}
else{
//Set_B of instructions
}
}
int main(){
think_and_do();
}
Run Code Online (Sandbox Code Playgroud)
第二:
void do_A(){
//Set_A of instructions
}
void do_B(){
//Set_B of instructions
}
int main(){
if(expression){
do_A();
}
else{
do_B();
}
}
Run Code Online (Sandbox Code Playgroud)
我已经在 godbolt.org think_and_do和main中进行了测试
首先观察,如果你的例子很琐碎,它们大部分都会被优化掉。如果没有这cin两个示例应该编译为:
xor eax, eax
add rsp, 8 #may or may not be present.
ret
Run Code Online (Sandbox Code Playgroud)
第二个观察结果是 main 中的代码完全相同:并且没有调用任何函数,所有内容都是内联的。
第三个观察结果是两个示例都生成了以下代码
mov edx, DWORD PTR a[rip]
mov eax, DWORD PTR b[rip]
cmp edx, eax
je .L8
Run Code Online (Sandbox Code Playgroud)
也就是说,它们填充 4 条指令的一个周期,以充分利用发出的指令(并忽略 cmp 和跳转的宏融合的可能性)。
如果他们一开始就
cmp edx, eax
je .L8
Run Code Online (Sandbox Code Playgroud)
一半的问题带宽可能会被浪费。
| 归档时间: |
|
| 查看次数: |
119 次 |
| 最近记录: |