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

简介: 我们日常写代码时,经常自己去做一些优化,其实绝大多数情况都是没必要的,因为编译器比你想的聪明太多! 下面这个例子就是明证, 这个是一个求竭诚的递归写法,很多老手都会告诉你这样写性能低,应该用循环。

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

下面这个例子就是明证,

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

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

目录
相关文章
|
6月前
|
编译器 Serverless C++
从汇编角度看函数调用过程
从汇编角度看函数调用过程
|
2月前
|
API Windows
MASM32编程完善SysInfo遇到奇怪故障,真切感受全局变量和局部变量之别……
MASM32编程完善SysInfo遇到奇怪故障,真切感受全局变量和局部变量之别……
|
编译器 测试技术 C语言
【C语言航路外传】隐式转换与优先级的那点事(你程序总是出bug的一个重要原因)
【C语言航路外传】隐式转换与优先级的那点事(你程序总是出bug的一个重要原因)
90 0
|
存储 C语言
写C语言代码时,肯定值得你注意的点
写C语言代码时,肯定值得你注意的点
|
安全 编译器 C++
内联函数和引用<C++入门>(跑路人笔记2)
内联函数和引用<C++入门>(跑路人笔记)
内联函数和引用<C++入门>(跑路人笔记2)
|
编译器 C++
内联函数和引用<C++入门>(跑路人笔记1)
内联函数和引用<C++入门>(跑路人笔记)
内联函数和引用<C++入门>(跑路人笔记1)
|
自然语言处理 编译器
进入编译器后,一个函数经历了什么?
进入编译器后,一个函数经历了什么?
92 0
进入编译器后,一个函数经历了什么?
|
Java 编译器 程序员
小师妹学JVM之:深入理解JIT和编译优化-你看不懂系列
小师妹学JVM之:深入理解JIT和编译优化-你看不懂系列
小师妹学JVM之:深入理解JIT和编译优化-你看不懂系列
|
自然语言处理 编译器
|
JavaScript 程序员 C语言
能一眼看懂这些C语言函数,你就是天生的程序员!
喜欢这篇文章的朋友可以多多收藏、点赞、关注 一条龙~
1656 0