zoukankan      html  css  js  c++  java
  • 不要做优化了!让编译器去干吧!

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

    下面这个例子就是明证,

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

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

  • 相关阅读:
    P2572 [SCOI2010]序列操作
    P2787 语文1(chin1)- 理理思维
    P1835 素数密度_NOI导刊2011提高(04)
    P3942 将军令
    P1273 有线电视网
    U45490 还没想好名字的题Ⅱ
    U40620 还没想好名字的题
    P4644 [Usaco2005 Dec]Cleaning Shifts 清理牛棚
    P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
    T51071 Tony到死都想不出の数学题
  • 原文地址:https://www.cnblogs.com/baizx/p/5583818.html
Copyright © 2011-2022 走看看