gcc的三级gcc 优化等级到底gcc 优化等级了哪些

浅析GCC的代码优化机制--《现代经济信息》2008年04期
浅析GCC的代码优化机制
【摘要】:GCC是基于Linux下的开放源码的优化编译系统,在大量开源软件和自由软件中都会用到,因此GCC的编译性能会直接影响到Linux、Firefox和Apache等数千个项目的质量。GCC的代码优化机制,不仅兼顾了时间、空间效率,而且还具有很强的可移植性和可扩充性,是研究编译器优化技术的最佳选择。本文探讨了GCC中的主要优化策略和机制,包括强度削弱、无用代码删除、寄存器的优化分配、预测程序技术等。
【作者单位】:
【关键词】:
【分类号】:TP316.81【正文快照】:
1引言Linux系统下的GCC(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一,是可以在多种硬件平台上编译出目标代码的超级编译器,它支持C、C++、JAVA等7种源语言以及MIPS、ARM等36种体系结构,其平均执行效率相比一般的编译器要高出20%~30%。G
欢迎:、、)
支持CAJ、PDF文件格式,仅支持PDF格式
【相似文献】
中国期刊全文数据库
陈品瓒;;[J];微计算机应用;1980年05期
陈品瓒;;[J];微计算机应用;1980年05期
罗伯特·鲍尔泽;栾聚成;;[J];计算机工程与科学;1982年04期
汪成为;[J];系统工程与电子技术;1983年08期
刘心松;[J];电子科技大学学报;1984年04期
袁宗轩;[J];微计算机应用;1984年03期
李铭,金茂忠;[J];微计算机应用;1984年03期
李明;;[J];计算机应用研究;1984年02期
李广星;[J];计算机工程与应用;1986年07期
,周明天;[J];电子科技大学学报;1986年04期
中国重要会议论文全文数据库
喻坚;隋厚棠;;[A];中国空间科学学会空间探测专业委员会第十一次学术会议论文集[C];1998年
王科俊;战兴群;金鸿章;李国斌;;[A];1995年中国智能自动化学术会议暨智能自动化专业委员会成立大会论文集(下册)[C];1995年
陈焕文;谢建平;谢丽娟;阮雪榆;;[A];1998年中国智能自动化学术会议论文集(上册)[C];1998年
李泽;法惟刚;;[A];第七届计算机模拟与信息技术学术会议论文集[C];1999年
王聪生;张清婷;;[A];土木工程计算机应用文集——中国土木工程学会计算机应用学会第五届年会论文集[C];1993年
Ernst L. L;[A];计算机在地学中的应用国际讨论会论文摘要集[C];1991年
张际兰;;[A];中国工程物理研究院科技年报(2000)[C];2000年
苏铭;王华;;[A];计算机在土木工程中的应用——第十届全国工程设计计算机应用学术会议论文集[C];2000年
梅刚;;[A];过程系统工程2001年会论文集[C];2001年
蒋小应;陶继忠;欧阳宁;;[A];中国工程物理研究院科技年报[C];2001年
中国重要报纸全文数据库
陈劲松;[N];计算机世界;2000年
冯军;[N];科技日报;2000年
郭胜;[N];中国建设报;2000年
学友;[N];电子报;2001年
学友;[N];电子报;2001年
马文方;[N];中国计算机报;2001年
晓周;[N];中国计算机报;2001年
;[N];网络世界;2001年
李斌;[N];北京日报;2002年
张九陆;[N];中国财经报;2002年
中国博士学位论文全文数据库
周彩章;[D];西安电子科技大学;2001年
林海波;[D];清华大学;2003年
琚小明;[D];浙江大学;2004年
陈凯明;[D];合肥工业大学;2004年
姜伟华;[D];复旦大学;2005年
金乃咏;[D];华东师范大学;2006年
王胜军;[D];吉林大学;2006年
吴佳骏;[D];中国科学院研究生院(计算技术研究所);2006年
杨君;[D];中国科学技术大学;2006年
齐宁;[D];解放军信息工程大学;2006年
中国硕士学位论文全文数据库
郝雷;[D];北京工业大学;2000年
秦晓君;[D];西北工业大学;2001年
陈骥;[D];湖南大学;2001年
陈凯;[D];北京工业大学;2001年
肖亚军;[D];南京航空航天大学;2002年
卜炜;[D];电子科技大学;2002年
姚泽勤;[D];西安电子科技大学;2002年
范忠锋;[D];西安电子科技大学;2002年
张春晓;[D];南京航空航天大学;2002年
张生芳;[D];大连铁道学院;2002年
&快捷付款方式
&订购知网充值卡
400-819-9993
《中国学术期刊(光盘版)》电子杂志社有限公司
同方知网数字出版技术股份有限公司
地址:北京清华大学 84-48信箱 大众知识服务
出版物经营许可证 新出发京批字第直0595号
订购热线:400-819-82499
服务热线:010--
在线咨询:
传真:010-
京公网安备75号GNU编译器提供-O选项供程序优化使用:
-O&提供基础级别的优化
-O2&提供更加高级的代码优化,会占用更长的编译时间
-O3&提供最高级的代码优化
-O4&不优化,这是默认值
不同的优化级别使用的优化技术也可以单独的应用于代码。 可以使用-f命令行选项引用每个
单独的优化技术。
1, 编译器优化级别1
在优化的第一个级别执行基础代码的优化。 这个级别试图执行9种单独的优化功能:
-fdefer-pop: 这种优化技术与汇编语言代码在函数完成时如何进行操作有关。 一般
情况下, 函数的输入值被保存在堆栈中并且被函数访问。 函数返回时, 输入值还在
堆栈中。 一般情况下, 函数返回之后, 输入值被立即弹出堆栈。这样做会使堆栈中
的内容有些杂乱。
-fmerge-constans: 使用这种优化技术, 编译器试图合并相同的常量. 这一特性有
时候会导致很长的编译时间, 因为编译器必须分析c或者c++程序中用到的每个常量,
并且相互比较他们.
-fthread-jumps: 使用这种优化技术与编译器如果处理汇编代码中的条件和非条件
分支有关。 在某些情况下, 一条跳转指令可能转移到另一条分支语句。 通过一连串
跳转, 编译器确定多个跳转之间的最终目标并且把第一个跳转重新定向到最终目标。
-floop-optimize: 通过优化如何生成汇编语言中的循环, 编译器可以在很大程序上
提高应用程序的性能。 通常, 程序由很多大型且复杂的循环构成。 通过删除在循环
内没有改变值的变量赋值操作, 可以减少循环内执行指令的数量, 在很大程度上提高
性能。 此外优化那些确定何时离开循环的条件分支, 以便减少分支的影响。
-fif-conversion: if-then语句应该是应用程序中仅次于循环的最消耗时间的部分。
简单的if-then语句可能在最终的汇编语言代码中产生众多的条件分支。 通过减少
或者删除条件分支, 以及使用条件传送 设置标志和使用运算技巧来替换他们, 编译
器可以减少if-then语句中花费的时间量。
-fif-conversion2: 这种技术结合更加高级的数学特性, 减少实现if-then语句所
需的条件分支。
-fdelayed-branch: 这种技术试图根据指令周期时间重新安排指令。 它还试图把
尽可能多的指令移动到条件分支前, 以便最充分的利用处理器的治理缓存。
-fguess-branch-probability: 就像其名称所暗示的, 这种技术试图确定条件分支最可
能的结果, 并且相应的移动指令, 这和延迟分支技术类似。 因为在编译时预测代码的安排,
所以使用这一选项两次编译相同的c或者c++代码很可能会产生不同的汇编语言代码, 这取决
于编译时编译器认为会使用那些分支。 因为这个原因, 很多程序员不喜欢采用这个特性, 并且
专门地使用-fno-guess-branch-probability选项关闭这个特性
-fcprop-registers: 因为在函数中把寄存器分配给变量, 所以编译器执行第二次检查以便减少
调度依赖性(两个段要求使用相同的寄存器)并且删除不必要的寄存器复制操作。
2, 编译器优化级别2
结合了第一个级别的所有优化技术, 再加上一下一些优化:
-fforce-mem: 这种优化再任何指令使用变量前, 强制把存放再内存位置中的所有变量都复制到寄存器
中。 对于只涉及单一指令的变量, 这样也许不会有很大的优化效果. 但是对于再很多指令(必须数学操作)
中都涉及到的变量来说, 这会时很显著的优化, 因为和访问内存中的值相比 ,处理器访问寄存器中的值要
-foptimize-sibling-calls: 这种技术处理相关的和/或者递归的函数调用。 通常, 递归的函数调用
可以被展开为一系列一般的指令, 而不是使用分支。 这样处理器的指令缓存能够加载展开的指令并且
处理他们, 和指令保持为需要分支操作的单独函数调用相比, 这样更快。
-fstrength-reduce: 这种优化技术对循环执行优化并且删除迭代变量。 迭代变量是捆绑到循环计数器
的变量, 比如使用变量, 然后使用循环计数器变量执行数学操作的for-next循环。
-fgcse: 这种技术对生成的所有汇编语言代码执行全局通用表达式消除历程。 这些优化操作试图分析
生成的汇编语言代码并且结合通用片段, 消除冗余的代码段。如果代码使用计算性的goto, gcc指令推荐
使用-fno-gcse选项。
-fcse-follow-jumps: 这种特别的通用子表达式消除技术扫描跳转指令, 查找程序中通过任何其他途径都不
会到达的目标代码。 这种情况最常见的例子就式if-then-else语句的else部分。
-frerun-cse-after-loop: 这种技术在对任何循环已经进行过优化之后重新运行通用子表达式消除例程。
这样确保在展开循环代码之后更进一步地优化还编代码。
-fdelete-null-pointer-checks: 这种优化技术扫描生成的汇编语言代码, 查找检查空指针的代码。编译
器假设间接引用空指针将停止程序。 如果在间接引用之后检查指针, 它就不可能为空。
-fextensive-optimizations: 这种技术执行从编译时的角度来说代价高昂的各种优化技术,但是它可能
对运行时的性能产生负面影响。
-fregmove: 编译器试图重新分配mov指令中使用的寄存器, 并且将其作为其他指令操作数, 以便最大化
捆绑的寄存器的数量。
-fschedule-insns: 编译器将试图重新安排指令, 以便消除等待数据的处理器。 对于在进行浮点运算时有
延迟的处理器来说, 这使处理器在等待浮点结果时可以加载其他指令。
-fsched-interblock: 这种技术使编译器能够跨越指令块调度指令。 这可以非常灵活地移动指令以便等待
期间完成的工作最大化。
-fcaller-saves: 这个选项指示编译器对函数调用保存和恢复寄存器, 使函数能够访问寄存器值, 而且不必
保存和恢复他们。 如果调用多个函数, 这样能够节省时间, 因为只进行一次寄存器的保存和恢复操作, 而
不是在每个函数调用中都进行。
-fpeephole2: 这个选项允许进行任何计算机特定的观察孔优化。
-freorder-blocks: 这种优化技术允许重新安排指令块以便改进分支操作和代码局部性。
-fstrict-aliasing: 这种技术强制实行高级语言的严格变量规则。 对于c和c++程序来说, 它确保不在数据
类型之间共享变量. 例如, 整数变量不和单精度浮点变量使用相同的内存位置。
-funit-at-a-time: 这种优化技术指示编译器在运行优化例程之前读取整个汇编语言代码。 这使编译器可以
重新安排不消耗大量时间的代码以便优化指令缓存。 但是, 这会在编译时花费相当多的内存, 对于小型计算机可能
是一个问题。
-falign-functions: 这个选项用于使函数对准内存中特定边界的开始位置。大多数处理器按照页面读取内存,
并且确保全部函数代码位于单一内存页面内, 就不需要叫化代码所需的页面。
-fcrossjumping: 这是对跨越跳转的转换代码处理, 以便组合分散在程序各处的相同代码。 这样可以减少
代码的长度, 但是也许不会对程序性能有直接影响。
3, 编译器优化级别3
它整合了第一和第二级别中的左右优化技巧, 还包括一下优化:
-finline-functions: 这种优化技术不为函数创建单独的汇编语言代码,而是把函数代码包含在调度程序的
代码中。 对于多次被调用的函数来说, 为每次函数调用复制函数代码。 虽然这样对于减少代码长度不利, 但是
通过最充分的利用指令缓存代码, 而不是在每次函数调用时进行分支操作, 可以提高性能。
-fweb: 构建用于保存变量的伪寄存器网络。 伪寄存器包含数据, 就像他们是寄存器一样, 但是可以使用各种
其他优化技术进行优化, 比如cse和loop优化技术。
-fgcse-after-reload: 这中技术在完全重新加载生成的且优化后的汇编语言代码之后执行第二次gcse优化,
帮助消除不同优化方式创建的任何冗余段。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1043次
排名:千里之外
原创:14篇}

我要回帖

更多关于 gcc o3 优化 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信