博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
不要做优化了!让编译器去干吧!
阅读量:7083 次
发布时间:2019-06-28

本文共 723 字,大约阅读时间需要 2 分钟。

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

下面这个例子就是明证,

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

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

转载地址:http://wpmml.baihongyu.com/

你可能感兴趣的文章
shell中字符串的截取方法、cut基本用法
查看>>
Install and Configure OpenStack Telemetry Metering Service (Ceilometer) for Ubuntu 14.04
查看>>
Linux 技巧:让进程在后台可靠运行的几种方法
查看>>
RowHandler的使用
查看>>
我的友情链接
查看>>
程序员辞职卖卷饼,4天挣了1个月工资……所以我应该改行卖卷饼吗?
查看>>
作业:Rsync+shell脚本完成自动化备份
查看>>
DKH企业级大数据解决方案的优势介绍
查看>>
arm嵌入式培训学校浅聊单片机、ARM、FPGA 、嵌入式开发的特点
查看>>
lvs+keepalived原理
查看>>
windows安装
查看>>
C实现2台主机间的passwordLess,基于配置文件批量建立主机之间的passwordless
查看>>
私有云桌面和公有云桌面的区别是什么
查看>>
ipmotool
查看>>
国家级期刊投稿要求
查看>>
mpls的基础原理
查看>>
大数据开发零基础需要学习什么内容?(1)Java、大数据基础
查看>>
SecureCRT教程——如何使用SecureCRT命令窗口将命令发送到多个会话
查看>>
php 字符串写入文件或追加入文件
查看>>
linux和windows软件收集
查看>>