GCC编译器代码优化
代码优化是指编译器通过分析源代码,找出其中尚未达到最优的部分,然后对其重新进行组合,目的是改善程序的执行性能。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编译器代码优化的更多相关文章
- gcc编译器命令使用详解
1.gcc包含的c/c++编译器gcc,cc,c++,g++,gcc和cc是一样的,c++和g++是一样的,(没有看太明白前面这半句是什么意思:))一般c程序就用gcc编译,c++程序就用g++编译 ...
- 在CentOS 7.2下升级gcc编译器的版本
默认情况下,CentOS 7.2预装的gcc版本是4.8.x,通过执行命令 gcc -v 可以看到,一般情况下这个版本的编译器已经满足需要了,但是某些特殊的时候为了支持C++更高的特性,需要对gcc编 ...
- C语言的编译过程、安装gcc编译器以及设置环境变量
以我对C语言编译过程的了解,我用了一点时间画了一个图,提供给大家参考一下,希望有些能对您的问题提上帮助. 前几天刚初步学习了C语言的编译过程,感触挺深的.在C语言中头文件其实起了一个很大的作用. 1. ...
- 利用GCC编译器生成动态链接库和静态链接库
转载请标明:http://www.cnblogs.com/winifred-tang94/ 1.编译过程 gcc –fPIC –c xxx.c 其中-fPIC是通知gcc编译器产生位置独立的目标代码. ...
- GCC编译器编译链接
在gcc编译器环境下,常见的文件扩展名的含义如下: .c:C源程序,经过预编译后的源程序也为.c文件,它可以通过-E参数输出. .h:头文件 .s:经过编译得到的汇编程序代码,它可以通过-S参数输出. ...
- Linux安装gcc编译器详解
本人使用的是CentOS 6.5 64位系统,由于在安装系统的时候并没有勾选安装gcc编译器,因此需要自行安装gcc编译器. 使用yum安装gcc 对于配备了yum的Linux发行版而言,安装gcc编 ...
- GCC编译器使用
一.GCC简介 通常所说的GCC是GUN Compiler Collection的简称,除了编译程序之外,它还含其他相关工具,所以它能把易于人类使用的高级语言编写的源代码构建成计算机能够直接执行的二进 ...
- GCC编译器和GDB调试器常用选项
http://blog.csdn.net/u014328976/article/details/46745349 GCC编译器 gcc hello.c -o hello ...
- 临时改GCC编译器,重启后失效
临时改GCC编译器,重启后失效.例如,用如下命令: export CROSS_COMPILE= <gcc 文件所在的目录>/arm-linux-gnueabihf- 本例中使用的命令如下: ...
随机推荐
- PHP导出CSV文件
经常会碰到需要从数据库中导出数据到Excel文件,用一些开源的类库,比如PHPExcel,确实比较容易实现,但对大量数据的支持很不好,很容易到达PHP内存使用上限.这里的方法是利用fputcsv写CS ...
- WCF技术的不同应用场景及其实现分析
这一篇文章,是总结一下WCF技术,以及基于这个技术发展出来的几个典型应用场景,并且我将尝试对这些不同的WCF实现的原理进行一些比较分析. 关于WCF这个技术的基本概念,如果你不是很清楚,可以参考一下有 ...
- Office 2007在安装过程中出错-解决办法
1, 可能是因为c:\program files\common files\microsoft Shared\web server Extensions\40\bin目录下缺少Fp4autl.dll, ...
- android 应用架构随笔五(ActionBar与侧滑菜单DrawerLayout)
ActionBar(V7)的添加非常简单,只需要在AndroidManifest.xml中指定Application或Activity的theme是Theme.Holo或其子类就可以了,在Androi ...
- 161109、windows下查看端口占用情况
1.开始---->运行---->cmd,或者是window+R组合键,调出命令窗口 2.输入命令:netstat -ano,列出所有端口的情况.在列表中我们观察被占用的端口,比如是4915 ...
- flexbox in IE (10+ and 9 and 8)
.parent { display: -webkit-box !important; display: -moz-box !important; display: -ms-flexbox !impor ...
- tomcat缓存静态资源深入
之前看过apach及nginx对于静态资源(含js,图片,css等)部分的缓存,用于加速并减轻后台实际web服务器的压力. 静态资源缓存是WEB服务器优化的一种手段,基本原理如下: 1.客户端浏览器请 ...
- c sharp学习 问题记录
1.函数的调用可以嵌套,定义不可以 C# 参考之方法参数关键字:params.ref及out C#中方法的参数的四种类型
- Install MongoDB on Red Hat Enterprise, CentOS, Fedora, or Amazon Linux
Install MongoDB on Red Hat Enterprise, CentOS, Fedora, or Amazon Linux¶ Overview Use this tutorial t ...
- iOS Button按钮 热区的放大
Apple的iOS人机交互设计指南中指出,按钮点击热区应不小于44x44pt,否则这个按钮就会让用户觉得“很难用”,因为明明点击上去了,却没有任何响应. 但我们有时做自定义Button的时候,设计 ...