Chinaunix首页 | 论坛 | 博客
  • 博客访问: 51126
  • 博文数量: 9
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 145
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-16 18:31
个人简介

关注PostgreSQL,关注数据库技术以及分布式系统,热爱开源,享受生活

文章分类

全部博文(9)

文章存档

2015年(1)

2014年(6)

2013年(2)

我的朋友

分类: LINUX

2014-07-10 00:04:46

GCC是一个具有优化功能的编译器,可以提高生成的可执行文件的运行速度或减少它的大小。代码优化大致可以分为两个级别:源代码级别机器指令级别

源代码级别
--------------
源码级别通常有:公共表达式消除和函数内嵌。前者将需要重复计算的表达式的结果保存至临时变量,待再次需要使用时直接使用该变量的值,无需重复计算;后者则是我们非常熟悉的内联函数的概念,编译器会自动将一些短小的函数展开,而非执行函数调用,从而避免函数调用的开销。
循环展开是一种速度-空间折中的优化方案,它通过将循环条件展开,避免每次进行条件判断,从而加快程序的执行速度,但与此同时,会增加代码的大小。

指令调度
-----------
最底层的优化是指令调度,编译器决定各条指令的最佳次序。绝大部分CPU允许在一条指令结束执行以前开始执行一条或多条新指令,即多指令在同一CPU上并行地执行。在指令调度优化打开的情况下,指令需要被重新安排,以便在适当的时间点,它们运行的结果对后面的指令是可获得的,以允许最大的并行执行。当然,这需要额外的内存和编译处理的时间。

GCC
---------------

命令行选项"-OLEVEL”,LEVEL是从1到3的数字,表示不同的优化级别。
-O0或没有-O选项:不进行任何优化,用尽可能直接的方法来编译源代码,每行代码被直接转换为可执行文件中的对应指令。当调试一个程序时,这是使用的最佳选项。
-O1或-O选项:该选项会打开那些不需要使用任何速度-空间折衷的最常见形式的优化,不会使用指令调度级别的优化。
-O2:在O1级别的基础上添加指令调度。对于要部署的程序而言,该级别通常是最佳选择,因为在不增加可执行文件大小的情况下,它提供了
-O3:打开更深度的优化,比如函数内嵌。该级别提升执行文件的速度,但也可能增加其大小。有些情况下优化反而是不利的,实际上会使得程序运行缓慢。
-funroll-loops:打开循环展开。
-Os:选择所见可执行文件大小的优化,目的是为内存和磁盘空间受限的系统生成尽可能小的可执行文件。

在使用优化选项时,需要权衡获得的好处与付出的代价,绝大部分情况下,调试时使用-O0,开发和部署时使用-O2就足够了。

参考文献
-----------
1. 
阅读(3188) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~