代码优化是指编译器通过分析源代码,找出其中尚未达到最优的部分,然后对其重新进行组合,目的是改善程序的执行性能。GCC提供的代码优化功能非常强大,它通过编译选项-On来控制优化代码的生成,其中n是一个代表优化级别的整数,比较典型的范围是从0变化到2或3。

  编译时使用选项-O可以告诉GCC同时减小目标代码的长度和执行时间,其效果等价于-O1。选项-O2告诉GCC除了完成-O1级别的优化之外,同时还要进行一些额外的调整工作,如处理器指令调度等。选项-O3则除了完成-O2级别的优化之外,还包括循环展开和其他一些与处理器特性相关的优化工作。通常来说,数字越大优化的等级越高,同时也意味着程序的运行速度越快。许多程序员喜欢使用-O2选项,因为它在优化长度、编译时间和代码大小之间取得了一个比较理想的平衡点。

  下面对程序optimize.c进行代码优化演示。

 #include<stdio.h>

 int main(void)
{
double counter;
double result;
double temp; for(counter = ; counter < 2000.0*2000.0*2000.0/20.0+; counter += (-)/)
{
temp = counter / ;
result = counter;
} printf("Result is %lf\n", result); return ;
}

(1) 不加任何优化选项进行编译:

gcc -Wall optimize.c -o optimize

(2) 借助Linux提供的time命令,统计出改程序在运行时所需的时间:

time ./optimize

Result is 400002019.000000

real 0m6.261s

user 0m6.250s

sys 0m0.000s

(3) 使用优化选项来对代码进行优化处理:

gcc -Wall -O optimize.c -o optimize

(4) 同样条件下再测试一下运行时间:

time ./optimize

Result is 400002019.000000

real 0m1.964s

user 0m1.960s

sys 0m0.000s

  对比两次结果不难看出,程序的性能得到了很大幅度的改善,由原来的6s缩短到1s。尽管GCC代码优化功能很强大,但还是要力求能手工编写出高质量的代码。如果写的代码简短,并且逻辑性强,编译器就不会做更多的工作,甚至根本不用进行优化。优化虽然能给程序带来更好的执行性能,但在一些场合中应避免优化代码:

  • 程序开发时    优化等级越高,消耗在编译上的时间越长,因此在开发时最好不要使用优化选项,只有到软件发行或开发结束的时候才考虑对最终生成的代码进行优化。
  • 资源受限时    一些优化选项会增加可执行代码的体积,如果程序在运行时能够申请到的内存资源非常紧张(如一些实时嵌入式设备),那就不要对代码进行优化,因为由这带来的负面影响可能会产生非常严重的后果。
  • 跟踪调试时    在对代码进行优化时,某些代码可能会被删除或改写,或者为了取得更加的性能而进行重组,从而使跟踪和调试变得异常困难。  

GCC编译器代码优化的更多相关文章

  1. gcc编译器命令使用详解

    1.gcc包含的c/c++编译器gcc,cc,c++,g++,gcc和cc是一样的,c++和g++是一样的,(没有看太明白前面这半句是什么意思:))一般c程序就用gcc编译,c++程序就用g++编译 ...

  2. 在CentOS 7.2下升级gcc编译器的版本

    默认情况下,CentOS 7.2预装的gcc版本是4.8.x,通过执行命令 gcc -v 可以看到,一般情况下这个版本的编译器已经满足需要了,但是某些特殊的时候为了支持C++更高的特性,需要对gcc编 ...

  3. C语言的编译过程、安装gcc编译器以及设置环境变量

    以我对C语言编译过程的了解,我用了一点时间画了一个图,提供给大家参考一下,希望有些能对您的问题提上帮助. 前几天刚初步学习了C语言的编译过程,感触挺深的.在C语言中头文件其实起了一个很大的作用. 1. ...

  4. 利用GCC编译器生成动态链接库和静态链接库

    转载请标明:http://www.cnblogs.com/winifred-tang94/ 1.编译过程 gcc –fPIC –c xxx.c 其中-fPIC是通知gcc编译器产生位置独立的目标代码. ...

  5. GCC编译器编译链接

    在gcc编译器环境下,常见的文件扩展名的含义如下: .c:C源程序,经过预编译后的源程序也为.c文件,它可以通过-E参数输出. .h:头文件 .s:经过编译得到的汇编程序代码,它可以通过-S参数输出. ...

  6. Linux安装gcc编译器详解

    本人使用的是CentOS 6.5 64位系统,由于在安装系统的时候并没有勾选安装gcc编译器,因此需要自行安装gcc编译器. 使用yum安装gcc 对于配备了yum的Linux发行版而言,安装gcc编 ...

  7. GCC编译器使用

    一.GCC简介 通常所说的GCC是GUN Compiler Collection的简称,除了编译程序之外,它还含其他相关工具,所以它能把易于人类使用的高级语言编写的源代码构建成计算机能够直接执行的二进 ...

  8. GCC编译器和GDB调试器常用选项

    http://blog.csdn.net/u014328976/article/details/46745349 GCC编译器 gcc hello.c -o hello                 ...

  9. 临时改GCC编译器,重启后失效

    临时改GCC编译器,重启后失效.例如,用如下命令: export CROSS_COMPILE= <gcc 文件所在的目录>/arm-linux-gnueabihf- 本例中使用的命令如下: ...

随机推荐

  1. Mysql子查询、关联查询

    mysql中update.delete.install尽量不要使用子查询 一.mysql查询的五种子句         where(条件查询).having(筛选).group by(分组).orde ...

  2. 鸟哥的linux私房菜学习记录之档案与目录管理

    绝对路径和相对路径 绝对路径就是从根目录到某个目录下的路径,从根目录写起,也就是/ 相对路径就是从用户当前目录的路径写起 目录相关操作 cd 切换路径 例如:cd /var/www 切换到/var/w ...

  3. declare和typeset DEMO

    declare=typeset,用法完成相同. declare不指定变量:显示所有变量的值. -r选项,把指定变量定义为只读变量: [xiluhua@vm-xiluhua][~]$ declare - ...

  4. 错误代码:ERR_UNSAFE_PORT

    修改下应用的端口为7788就好了:http://localhost:7788/taiping-sol-insu-vehicle/vehicleEntrance.action. 这个主要是chrome的 ...

  5. nginx完美支持yii2框架

    nginx完美支持yii2框架 server {listen 80;server_name www.peita.net peita.net;# default_server;access_log /d ...

  6. SpringMVC项目,启动项目怎么总是报找不到log4j.properties文件

    具体操作:右键项目---->properties--->Java Build Path--->source--->Add Folder --->选择log4.proper ...

  7. 层叠样式表(CSS)

    层叠样式表(CSS) CSS(Cascading Style Sheet)中文译为层叠样式表.是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言.CSS的引入就是为了使得HTML语言能够 ...

  8. Cocos2dx-lua开发之c++绑定到lua

    一. 简单介绍 文章介绍是在实际的游戏开发项目中,将自定义的C++类绑定到lua中,能够让lua调用c++类.会创建一个python脚本,执行python脚本会让自动将我们的c++类绑定到lua.生成 ...

  9. 三对角矩阵(Tridiagonal Matrices)的求法:Thomas Algorithm(TDMA)

    转载http://www.cnblogs.com/xpvincent/archive/2013/01/25/2877411.html 做三次样条曲线时,需要解三对角矩阵(Tridiagonal Mat ...

  10. preparedStatement和Statement 有什么不一样

    1. PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象.    2.作 ...