不要做优化了!让编译器去干吧!

我们日常写代码时,经常自己去做一些优化,其实绝大多数情况都是没必要的,因为编译器比你想的聪明太多!

下面这个例子就是明证,

这个是一个求竭诚的递归写法,很多老手都会告诉你这样写性能低,应该用循环。

int rfact(int x)

{

    int rval;

    if(x<=1)

        return 1;

    rval=rfact(x-1);

    return rval*x;

}

 

我想大家一般都不会有什么异议,那么来看看生成的代码是什么样子吧!

编译方法 gcc –O2 –S rfact.c

我只贴上关键的汇编代码,看看是不是毁三观!

_rfact:

    movl    4(%esp), %edx

    movl    $1, %eax

    cmpl    $1, %edx

    jg    L3

    jmp    L2

    .p2align 4,,7

L9:

    movl    %ecx, %edx

L3:

    leal    -1(%edx), %ecx

    imull    %edx, %eax

    cmpl    $1, %ecx

    jne    L9

L2:

    rep ret

 

看到了吧,没有递归,没有递归,没有递归! 编译器帮你转换成循环了。 当然编译不能把所有的递归都转换成循环,但是可以看出大多数的优化真心没必要,只会带来错误, 比如使用右移来代替除法之类的,这些真心out了!

再给你看一个编译器优化的例子,比你想的聪明多了。

int choice3(int x)

{

    return 15*x;

}

你觉得这里编译器会用乘法?那你错了!你错了!你错了!

_choice3:

    movl    4(%esp), %edx

    movl    %edx, %eax

    sall    $4, %eax

    subl    %edx, %eax

    ret

看到了么?乘以16-1,聪明吧。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值