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

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

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

下面这个例子就是明证,

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

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

目录
相关文章
typro收费了,怎么看markdown文章?推荐谷歌markdown插件
typro收费了,怎么看markdown文章?推荐谷歌markdown插件
317 0
typro收费了,怎么看markdown文章?推荐谷歌markdown插件
【精讲】PCIe基础篇——PCIe传输速率计算
我们在接触PCIe设备时会接触到一个词,传输速率,比如8GT/s。或者有人问你设备的带宽多少?通信速率多少?本文带你了解下。
7420 0
【精讲】PCIe基础篇——PCIe传输速率计算
|
消息中间件 Apache RocketMQ
rocketmq客户端发送消息报错和超时问题
org.apache.rocketmq.remoting.exception.RemotingTimeoutException: wait response on the channel <10.0.21.69:10911> timeout, 1000(ms)、 closeChannel: close the connection to remote address
4689 1
rocketmq客户端发送消息报错和超时问题
|
Dubbo 网络协议 Java
RPC框架:一文带你搞懂RPC
这篇文章全面介绍了RPC(远程过程调用)的概念、原理和应用场景,解释了RPC如何工作以及为什么在分布式系统中广泛使用,并探讨了几种常用的RPC框架如Thrift、gRPC、Dubbo和Spring Cloud,同时详细阐述了RPC调用流程和实现透明化远程服务调用的关键技术,包括动态代理和消息的编码解码过程。
RPC框架:一文带你搞懂RPC
|
分布式计算 DataWorks 调度
DataWorks产品使用合集之如何在DataWorks on EMR上创建Spark节点并指定DLF的catalog
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
146 8
|
移动开发 小程序 安全
基础入门-APP架构&小程序&H5+Vue语言&Web封装&原生开发&Flutter
基础入门-APP架构&小程序&H5+Vue语言&Web封装&原生开发&Flutter
217 0
|
分布式计算 DataWorks 关系型数据库
DataWorks常见问题之pyodps报错如何解决
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
172 6
|
Java 关系型数据库 MySQL
基于Springboot的三方线上美食商城系统
基于Springboot的三方线上美食商城系统
101 0
|
异构计算
[笔记]音视频学习之SDL篇《十》绘制矩形,线条
[笔记]音视频学习之SDL篇《十》绘制矩形,线条
232 0
|
前端开发 API PHP
PHP写一个 Api接口需要注意哪些?考虑哪些?
随着互联网的飞速发展,前后端分离的开发模式越来越流行。编写一个稳定、可靠和易于使用的 API 接口是现代互联网应用程序的关键。本文将介绍在使用 thinkphp6 框架开发 API 接口时需要注意的要点和考虑的问题,并提供详细的逻辑步骤和代码案例。