Chinaunix首页 | 论坛 | 博客
  • 博客访问: 22056
  • 博文数量: 13
  • 博客积分: 1455
  • 博客等级: 上尉
  • 技术积分: 140
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-29 10:42
文章分类

全部博文(13)

文章存档

2011年(1)

2010年(2)

2009年(10)

我的朋友

分类: LINUX

2009-05-08 16:58:24

     本文从金步国《gcc编译优化指南》中摘抄可以个人可以理解和推荐使用的部分,留作参考。
一,CFLAGS 与 CXXFLAGS
CFLAGS 表示用于 C 编译器的选项,CXXFLAGS 表示用于 C++ 编译器的选项。这两个变量实际上涵盖了编译和汇编两个步骤。大多数程序和库在编译时默认的优化级别是"2"(使用"-O2"选项)并且带有调试符号来编译,也就是 CFLAGS="-O2 -g", CXXFLAGS=$CFLAGS 。事实上,"-O2"已经启用绝大多数安全的优化选项了。另一方面,由于大部分选项可以同时用于这两个变量,所以仅在最后讲述只能用于其中一个变量的选项。[提醒]下面所列选项皆为非默认选项,你只要按需添加即可。
 
-O3【-O1 ...-O3优化级别】
-finline-functions
允许编译器选择某些简单的函数在其被调用处展开,比较安全的选项,特别是在CPU二级缓存较大时建议使用
 
-falign-functions=N
-falign-jumps=N
-falign-loops=N
-falign-labels=N
这四个对齐选项在"-O2"中打开,其中的根据不同的平台N使用不同的默认值。如果你想指定不同于默认值的N,也可以单独指定。比如,对于L2-cache>=1M的cpu而言,指定 -falign-functions=64 可能会获得更好的性能。建议在指定了 -march 的时候不明确指定这里的值。

全局选项:

-pipe
在编译过程的不同阶段之间使用管道而非临时文件进行通信,可以加快编译速度。建议使用。【貌似只有在编译的时候起作用。
-fstack-check
为防止程序栈溢出而进行必要的检测,仅在多线程环境中运行时才可能需要它。

硬件体系结构相关选项[仅仅针对x86与x86_64]:

-march=cpu-type
为特定的cpu-type编译二进制代码(不能在更低级别的cpu上运行)。Intel可以用:pentium2, pentium3(=pentium3m), pentium4(=pentium4m), pentium-m, prescott, nocona, core2(GCC-4.3新增) 。AMD可以用:k6-2(=k6-3), athlon(=athlon-tbird), athlon-xp(=athlon-mp), k8(=opteron=athlon64=athlon-fx)
-mfpmath=sse
P3和athlon-xp级别及以上的cpu支持"sse"标量浮点指令。仅建议在P4和K8以上级别的处理器上使用该选项。
-mmmx
-msse
-msse2
-msse3
-m3dnow
-mssse3(GCC-4.3新增)
-msse4.1(GCC-4.3新增)
-msse4.2(GCC-4.3新增)
-msse4(含4.1和4.2,GCC-4.3新增)
是否使用相应的扩展指令集以及内置函数,按照自己的cpu选择吧!【请参照cat /proc/cpuinfo中flags:里面的信息】

传递给汇编器的选项:

-Wa,-march=CPU
按照特定的CPU进行优化:pentiumiii, pentium4, prescott, nocona, core, core2; athlon, sledgehammer, opteron, k8 。【不解,和上边的-march有什么区别。】

仅可用于 CXXFLAGS 的选项:

-fvisibility-inlines-hidden
默认隐藏所有内联函数,从而减小导出符号表的大小,既能缩减文件的大小,还能提高运行性能,我们强烈建议你在编译任何共享库的时候使用该选项。参见 -fvisibility=hidden 选项。
 

march指定的是当前cpu的架构,而mtune是真正作用于某一型号cpu的选项。

【一个相对安全的策略CFLAGS="-march=native -mtune=native 指令集参数 -pipe -O3"; CXXFLAGS 参数,直接让他等于 CLAGS 。CXXFLAGS="${CFLAGS}"】

二,LDFLAGS

是传递给连接器的选项。这是一个常被忽视的变量,事实上它对优化的影响也是很明显的。

-s   删除可执行程序中的所有符号表和所有重定位信息。其结果与运行命令 strip 所达到的效果相同,这个选项是比较安全的。
-Wl,--hash-style=gnu
使用gnu风格的符号散列表格式。它的动态链接性能比传统的sysv风格(默认)有较大提升,但是它生成的可执行程序和库与旧的Glibc以及动态链接器不兼容。

   最后将选定好的编译参数写入到某个环境变量的文件里。

阅读(2330) | 评论(0) | 转发(0) |
0

上一篇:linux时区设置

下一篇:interl处理器

给主人留下些什么吧!~~