编写高效代码(5) 尽量减少分支

我们在介绍处理器时,已经知道了,现在的处理器都是流水线结构,if和switch等语句会带来跳转,而跳转会打乱流水线的正常执行,影响程序的执行效率。

         下面这段代码,把奇数赋一个值,把偶数赋一个值,可以用这种方式实现: 

  1. for(i=0; i<100; i++)  
  2.   
  3. {  
  4.   
  5.    if(i%2 == 0)  
  6.   
  7.    {  
  8.   
  9.        a[i] = x;  
  10.   
  11.    }  
  12.   
  13.    else  
  14.   
  15.    {  
  16.   
  17.        a[i] = y;  
  18.   
  19.    }  
  20.   
  21. }  

 

如果改成如下这种形式就更好了:

  1. <span style="font-size:18px;">for(i=0; i<100; i+=2)  
  2.   
  3. {  
  4.   
  5.    a[i] = x;  
  6.   
  7.    a[i+1] = y;  
  8.   
  9. }  
  10. </span>  


  将最可能进入的分支放在 if中,而不是else中

         Intel处理器有分支预测单元,第一次进入一个分支时,由于没有历史信息可供参考,是否跳转取决于Static Predictor(静态预测器)的预测策略,通常Static Predictor的策略是:向下跳转预测为不跳转,向上跳转预测为跳转。根据这个特性,我们在写if else语句时,也要注意。且看下面这段代码是否合适? 

  1. int a = -5;  
  2.   
  3. int b = 0;  
  4.   
  5. if (a > 0)  
  6.   
  7. {  
  8.   
  9.    b = 1;  
  10.   
  11. }  
  12.   
  13. else  
  14.   
  15. {  
  16.   
  17.    b = 2;  
  18.   
  19. }  

 

我们来看看汇编语言:

 

  1. 4:        int a = -5;  
  2.   
  3. 00401028   mov         dword ptr [ebp-4],0FFFFFFFBh  
  4.   
  5. 5:        int b = 0;  
  6.   
  7. 0040102F   mov         dword ptr [ebp-8],0  
  8.   
  9. 6:        if (a > 0)  
  10.   
  11. 00401036   cmp         dword ptr [ebp-4],0  
  12.   
  13. 0040103A   jle         main+35h (00401045)  
  14.   
  15. 7:        {  
  16.   
  17. 8:            b = 1;  
  18.   
  19. 0040103C   mov         dword ptr [ebp-8],1  
  20.   
  21. 9:        }  
  22.   
  23. 10:       else  
  24.   
  25. 00401043   jmp         main+3Ch (0040104c)  
  26.   
  27. 11:       {  
  28.   
  29. 12:           b = 2;  
  30.   
  31. 00401045   mov         dword ptr [ebp-8],2  
  32.   
  33. 13:       }  
       读者没必要管这么一大串汇编语言是什么意思,只需要知道jle是个条件跳转指令就可以了,它跳到地址00401045处,是向下跳,根据Static Predictor的策略,它被预测为不跳转,处理器会从0040103C地址处开始取下一条指令。再看看实际的执行情况,a<0,执行else这个分支,于是处理器发现取错了地址,又要从头来过,白白浪费了大量时间。可见,执行概率高的分支,应该放在if分支中。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值