C语言for循环效率记录1

对比#if 1和#if 0 两种代码编写方式,经过反编译汇编对比得出:
for循环逻辑指令少(30行),但是存在循环跳转,因此展开循环体指令数量远超累加方式,执行效率低(这里忽略每条指令执行耗时差异);
累加方式逻辑指令多(33行),但无跳转因此效率高。
因为for循环只有3次,且循环体逻辑简单,因此展开书写更好,如果循环体逻辑复杂,则循环体的逻辑指令大于循环指令,则for循环方式更好!
static u32 bits21Tou32(u8 *indata)
{
#if 1  
    u32  temp=0;
    
    temp = (temp<<8) + indata[0];
    temp = (temp<<8) + indata[1];
    temp = (temp<<8) + indata[2];
    return temp;    
#else
    u32 temp = 0;
    u32 i;

    for(i = 0;i<3;i++)
    {
        temp = (temp<<8) + indata[i];
    }

    return temp;
#endif
}
0102db38 <bits21Tou32>://走for循环3次的反汇编
 102db38:    b480          push    {r7}
 102db3a:    b085          sub    sp, #20
 102db3c:    af00          add    r7, sp, #0
 102db3e:    6078          str    r0, [r7, #4]
 102db40:    2300          movs    r3, #0
 102db42:    60fb          str    r3, [r7, #12]
 102db44:    2300          movs    r3, #0
 102db46:    60bb          str    r3, [r7, #8]
 102db48:    e00a          b.n    102db60 <bits21Tou32+0x28>
 102db4a:    68fb          ldr    r3, [r7, #12]
 102db4c:    021b          lsls    r3, r3, #8
 102db4e:    6879          ldr    r1, [r7, #4]
 102db50:    68ba          ldr    r2, [r7, #8]
 102db52:    440a          add    r2, r1
 102db54:    7812          ldrb    r2, [r2, #0]
 102db56:    4413          add    r3, r2
 102db58:    60fb          str    r3, [r7, #12]
 102db5a:    68bb          ldr    r3, [r7, #8]
 102db5c:    3301          adds    r3, #1
 102db5e:    60bb          str    r3, [r7, #8]
 102db60:    68bb          ldr    r3, [r7, #8]
 102db62:    2b02          cmp    r3, #2
 102db64:    d9f1          bls.n    102db4a <bits21Tou32+0x12>//调到102db4a循环
 102db66:    68fb          ldr    r3, [r7, #12]
 102db68:    4618          mov    r0, r3
 102db6a:    3714          adds    r7, #20
 102db6c:    46bd          mov    sp, r7
 102db6e:    bc80          pop    {r7}
 102db70:    4770          bx    lr
    ...
    
0102db38 <bits21Tou32>://走连续累加3次的反汇编
 102db38:    b480          push    {r7}
 102db3a:    b085          sub    sp, #20
 102db3c:    af00          add    r7, sp, #0
 102db3e:    6078          str    r0, [r7, #4]
 102db40:    2300          movs    r3, #0
 102db42:    60fb          str    r3, [r7, #12]
 102db44:    68fb          ldr    r3, [r7, #12]
 102db46:    021b          lsls    r3, r3, #8
 102db48:    687a          ldr    r2, [r7, #4]
 102db4a:    7812          ldrb    r2, [r2, #0]
 102db4c:    4413          add    r3, r2
 102db4e:    60fb          str    r3, [r7, #12]
 102db50:    68fb          ldr    r3, [r7, #12]
 102db52:    021b          lsls    r3, r3, #8
 102db54:    687a          ldr    r2, [r7, #4]
 102db56:    3201          adds    r2, #1
 102db58:    7812          ldrb    r2, [r2, #0]
 102db5a:    4413          add    r3, r2
 102db5c:    60fb          str    r3, [r7, #12]
 102db5e:    68fb          ldr    r3, [r7, #12]
 102db60:    021b          lsls    r3, r3, #8
 102db62:    687a          ldr    r2, [r7, #4]
 102db64:    3202          adds    r2, #2
 102db66:    7812          ldrb    r2, [r2, #0]
 102db68:    4413          add    r3, r2
 102db6a:    60fb          str    r3, [r7, #12]
 102db6c:    68fb          ldr    r3, [r7, #12]
 102db6e:    4618          mov    r0, r3
 102db70:    3714          adds    r7, #20
 102db72:    46bd          mov    sp, r7
 102db74:    bc80          pop    {r7}
 102db76:    4770          bx    lr

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值