GCC编译器优化选项分析及具体优化了什么

问题



在使用gcc作为编译器。在设定编译条件时,在debug模式下生成的程序正常,但是在release模式下往往会出现很多种预料之外的结果,尤其在嵌入式环境中,程序在板子上运行的时候,问题就愈发明显。
为了了解具体为什么造成该问题,对两种模式下的配置做了对比
debug模式编译器参数为-O0 -g –Wall
release模式编译器参数为-O2 -g –Wall

通过对比可以发现两种模式主要的不同在于编译器优化程度不同,那么编译器在两种优化下究竟做了什么优化那?现在我们来看看gcc编译器的优化参数到底做了什么优化

-O0

这里只介绍优化编译的参数
-O用来开启优化编译选项。
-O0:默认模式,不做任何优化。

-O1



-O1:优化。该模式下对于一个大的函数或功能会花费更多的时间和内存。
在-O1下:编译会尝试减少代码体积和代码运行时间。但是并不执行会花费大量时间的优化操作。
在该模式下将打开一下优化选项:

优化选项 描述
-fdefer-pop 推迟推出函数调用的参数,对于那些需要在函数调用后必须取出(pop)函数参数的机器而言,打开该项编译器将把函数调用的参数压入栈,等必要时几个函数调用参数一起取出(pop)。这将节省处理时间。
-fdelayed-branch 如果对目标机支持这个功能,它试图重新排列指令,以便利用延迟分支(delayed branch)指令后面的指令空隙.
-fguess-branch-probability 使用启发式算法预测分之指令,增加指令的命中率,提升运行效果。
-fcprop-registers 使用寄存器之间copy-propagation传值,因为在函数中把寄存器分配给变量, 所以编译器执行第二次检查以便减少调度依赖性(两个段要求使用相同的寄存器)并且删除不必要的寄存器复制操作
-floop-optimize 通过优化如何生成汇编语言中的循环, 编译器可以在很大程序上提高应用程序的性能。 通常, 程序由很多大型且复杂的循环构成。 通过删除在循环内没有改变值的变量赋值操作, 可以减少循环内执行指令的数量, 在很大程度上提高性能。 此外优化那些确定何时离开循环的条件分支, 以便减少分支的影响
-fif-conversion if-then语句应该是应用程序中仅次于循环的最消耗时间的部分,简单的if-then语句可能在最终的汇编语言代码中产生众多的条件分支通过减少或者删除条件分支, 以及使用条件传送 设置标志和使用运算技巧来替换他们, 编译器可以减少if-then语句中花费的时间量。
-fif-conversion2 这种技术结合更加高级的数学特性, 减少实现if-then语句所需的条件分支。
-ftree-ccp
-ftree-dce
-ftree-dominator-opts
-ftree-dse
-ftree-ter
-ftree-lrs
-ftree-sra
-ftree-copyrename
-ftree-fre
-ftree-ch
-funit-at-a-time
-fmerge-constants

该模式下在不影响调试的状况下还会打开‘-fomit-frame-pointer优化项。
同时该模式不会为Ada编译器打开‘-ftree-sra’优化项,如需要则请使用命令参数输入‘-ftree-sra’进行优化。

-O2



进一步优化.GCC执行几乎所有支持的操作但不包括空间和速度之间权衡的优化。
-O2优化等级下,并不执行循环展开和函数“内联”优化操作。
与-O1比较该优化-O2将会花费更多的编译时间当然也会生成性能更好的代码。

-O2除了打开-O1的所有优化参数外还打开以下优化选项。

优化选项 描述
-fthread-jumps
-fcrossjumping
-foptimize-sibling-calls
-fcse-follow-jumps -fcse-skip-blocks
-fgcse -fgcse-lm
-fexpensive-optimizations
-fstrength-reduce
-frerun-cse-after-loop -frerun-loop-o
-fcaller-saves
-fpeephole2
-fschedule-insns -fschedule-insns2
-fsched-interblock -fsched-spec
-fregmove
-fstrict-aliasing
-fdelete-null-pointer-checks
-freorder-blocks -freorder-functions
-falign-functions -falign-jumps
-falign-loops -falign-labels
-ftree-vrp
-ftree-pre

还要注意-fgcse下关于请求-O2优化等级的用于计算goto的程序。

-O3



-O3:更进一步优化。-O3打开-O2指定的所有优化操作并且打开:

-finline-functions
-funswitch-loops
-fgcse-after-reload
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

优化项-O3

-Os:针对程序空间大小优化(多用于嵌入式系统)。
-Os使能-O2中除去会增加程序空间的所有优化参数。同时-Os还会执行更加优化程序空间的选项。
-Os会关闭以下优化选项:

优化选项 描述
-falign-functions
-falign-jumps
-falign-loops
-falign-labels
-freorder-blocks
-freorder-blocks-and-partition
-fprefetch-loop-arrays
-ftree-vect-loop-version

关于GCC编译的优化选项一共有-O0(默认),-O1,-O2,-O3及-Os五个参数。
各个参数优选内容如上所示。
但是各个优化内容到底是指什么那?继续分析。

转载:http://blog.csdn.net/gatieme/article/details/48898261

时间: 2024-11-10 01:12:27

GCC编译器优化选项分析及具体优化了什么的相关文章

网站内容页的优化排名分析 根据用户需求优化

今天的主题,就是我们网站内容页的优化排名,这一篇关于原创.伪原创.转载的内容的优化排名的文章. 怎样做好网站内容页的优化,来提高我们的网站用户体验呢?下面我将详细讲解. 内容页是我们最终要提供给用户的信息,也是用户最想从你这里得到的信息.我们做过seo的都会知道,当你的一篇纯原创的文章不一定能获得好的排名,反而别人的转载就能获得好的排名.我想很多seoer都在为这点烦恼过.搜索引擎是一个程序,它不会去考察你的文章是否是经过你的某某网站之手;而是通过一系列的程序计算你的文章能提供给用户什么,用户通

MySQL下的RAND()优化案例分析_Mysql

众所周知,在MySQL中,如果直接 ORDER BY RAND() 的话,效率非常差,因为会多次执行.事实上,如果等值查询也是用 RAND() 的话也如此,我们先来看看下面这几个SQL的不同执行计划和执行耗时. 首先,看下建表DDL,这是一个没有显式自增主键的InnoDB表: [yejr@imysql]> show create table t_innodb_random\G *************************** 1. row *************************

浮点优化选项 -ffast-math:极大地提高浮点运算速度【转】

转自:http://blog.csdn.net/zjujoe/article/details/2604157 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 关于浮点优化选项摘自C in a nutshell 测试 测试方法 marvell 编译器 -ffast-math 测试结果 Meamo 编译器 -ffast-math 测试结果 关于浮点优化选项:(摘自C in a nutshell) C99 浮点环境支持科学和数学级别的应用,这些应用必须有相当高的精度,但是某些应

SQL语句优化技术分析

优化|语句 操作符优化 IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格. 但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别:        ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询.由此可见用IN的SQL至少多了一个转换的过程.一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不

网站运维优化过程中遇到的优化挫折分析

网站运维优化过程中遇到的优化挫折分析 众所周知,网站优化是中小企业选择互联网营销最重要的手段之一,互联网的飞速发展,导致人们对于搜索引擎的需求激增,不可避免的网站优化工作也应运而生,在优化网站的同时,我们不仅仅要认识搜索引擎带来精准流量和转化率的同时,必须时刻警惕,网站优化过程中会面临的种种不稳定性因素,好了闲话短续今天今天主题,网站运维优化过程中遇到的优化挫折分析. 第一,高质量的原创文章撰写难度分析.不可否认很多优化人员都是建站或者程序出身,自身文案水平会存在一些瑕疵,加之互联网产品大同小异

有理有据分析网站SEO优化十大误区(上篇)

在互联网上,大家要是搜索这个标题,可能会觉得并不新鲜.关于网站SEO优化问题的探讨在诸多站长中一直没有停过,尤其是新网站做网站优化进行网站分析的时候,很容易陷入优化误区.废话不多说,进入今天的主题. 第一个误区:网站定位不明确,模糊优化 你建立的网站,目的是什么?你的网站服务人群或者说用户是哪些群体?网站内容是否有针对性的进行了整合和思考?你考虑了你的网站用户吗?   很显然,我们需要反思了.我最近自己也在考虑这个问题,很多站长都是网站做着做着就偏离了自己的主题了.我以如下网站为例:   这个网

如何利用百度管理员工具简单分析网站近期优化数据

众所周知,网站优化过程中数据分析是必不可少的日常工作,尤其对于一个新手朋友而言,笔者建议最好去百度站长平台申请下百度站长工具,一般就是提交申请的网站,下载验证码到ftp用域名访问这个验证码文件即可验证成功,新申请的网站数据信息,一般数据需经过一天之后才会显示在百度网站管理员工具的后台,今天笔者以自己蓝田玉网站为例子进行分析下如何用百度管理员工具分析我们网站优化数据.   第一,分析网站的百度索引量.首先笔者第一张图放的是近一周百度对于自身网站索引量的分析,上周笔者通过观其站长工具查到自己网站收录

简单分析针对搜索引擎优化的三个阶段

做SEO优化绝大部分的精力都会放在针对搜索引擎上面的优化,通常针对搜索引擎优化都有三个阶段,下面我们就来简单分析一下这三个阶段! 第一阶段:这是初始化的阶段,这个时期是搜索引擎对新网站的考察期,通常百度考察的比较严格,谷歌考察的比较宽松,此时搜索引擎会对网站的首页会优先收录,算是给站长们的鼓励,对于内容一般收录很少,排名也是镜花水月,看不清楚,搜索引擎的蜘蛛更是很少光顾,此时的优化主要是优化网站的代码,定时定量的更新网站内容,每天做少量的外链,当然这些外链质量要高一点,这个优化阶段大致要花费近一

透过百度百科分析百度SEO优化策略

很多人对百度百科是又爱又恨,爱的是能够有效的提升自己网站的权重,也能够帮助网站获得更多的流量,恨的是编辑的词条是一次又一次的不通过,最后不得不流产,实在是非常让人愤恨,可是不管爱也好,恨也好,都是因为百度百科的作用实在是太大了! 可是大家如果认为百度百科只是具有上面所说的作用那就大错而特错了,其实我们如果细心的研究百度百科,我们就能够得出正确的SEO优化策略,从而让自己的网站能够轻松的针对百度优化成功,获得更好的排名,下面我们就来分析一下如何透过百度百科来获得更好的SEO优化策略的思路! 一:看