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

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

下面这个例子就是明证,

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

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,聪明吧。

posted on 2016-06-14 13:56  baizx  阅读(1766)  评论(0编辑  收藏  举报