【 tulaoshi.com - Linux 】
相信使用lfs,gentoo的用户对CFLAGS这个东东会比较了解 :)不少Linuxer对Gentoo,LFS的印象是速度比其他发行版要快的多! 而这个CFLAGS就是达到最佳效能的东东。 如果你想编译出的程序更快,运行的更好。快来挑选出最符合自己的CFLAGS吧! ^_^
CFLAGS 简介 CFLAGS 是决定 Gentoo 系统效能与稳定的关键之一。恰当的 CFLAGS 能在效能、编译时间、与系统稳定度中取得平衡,失败的 CFLAGS 可能导致编译失败,甚至系统损毁。那么,在茫茫 CFLAGS 海中,如何才能捞到命中注定那根针呢? 此文件的 CFLAGS 针对 x86 与 x86-64 平台上的 GCC 3.4 (GNU Compiler Collections - http://gcc.gnu.org/) 为主,若您使用其它编译器 (如 icc、compaq c compiler) 或其它平台 (如 PowerPC、Alpha),本章可能 50% 以上的东西您都用不上。 各位请先参考笔者从网络上整理出,有关服务器与工作站需求的信息。当然,服务器或桌面的需求绝对不只这些,这里仅列出跟设计 CFLAGS 比较有关的项目。以下是整理出的列表: 1. 服务器系统: * 长时间启动 (一天 24 小时,一年 365 天,全年无休) * 非常稳定 (uptime 在 99.999% [注] 以上) * 高安全性 (别怀疑,CFLAGS 跟安全性也有很大的关系) * 在长时间启动的前提下,能自己照顾自己。 * 效能不是第一考虑 * 互动反应不用很快,够用就好。 2. 桌面、工作站: * 启动时间没有那么长 (使用者要用的时候才开机) * 可以不用那么稳定 (多半有使用者直接在处理,uptime 可以降到 99.99% 或更低) * 效能也是考虑重点 * 互动反应快 (如加载一页网页,与其让他在三秒时整面显示出来,不如让它每秒显示一点可是在四秒时才全部显示完毕。) 所以,得到了桌面系统的 CFLAGS 设计要点: 1. 程序启动时间短 2. 反应速度快 3. 效能高 4. 稳定可以稍差 (容许范围内) 减少执行档的大小,可以同时减少了内存用量,也节省了一些磁盘空间。同时,桌面系统最大的效能瓶颈就在磁盘驱动器,减少档案大小也间接降低了磁盘的存取次数,可以加速程序的启动,提升第一次执行的反应速度。 [编辑] CFLAGS 选项 再来,让我们看看 gcc 中关键的几个选项。这里只简单介绍这些选项的功能,若要详细说明请参考 man gcc。 增加选项的数量,同时也增加编译的时间。所有的选项都会增加编译时间,有特别说明 "会增加编译时间" 的选项,表示会增加 "大量的" 编译时间 (跟其它选项比起来...)。 [编辑] 比较安全的选项 首先是安全的选项: * 指令 o 参数与用法 [注二] o 说明 o 建议 * -O o -O (-O1), -O0, -O2, -O3, -Os o 依照后面数字的大小,针对效能最佳化的程度也不同 (稳定度也可能递减)。其中 -Os 是个比较特殊的等级,针对原始码大小最佳化。 o 可使用 -Os,降低程序加载的时间。 * -fforce-mem -fforce-addr o -fforce-mem, -fno-force-mem -fforce-addr, -fno-force-addr o 强制在运算前将内存中的数值 (mem) 或内存位置 (addr) 复制到缓存器中。启动这两个选项可以做出较好的程序代码。 o 这两个是好东西,启动它们!其中 -fforce-mem 已在 -O2, -O3, -Os 中启动,所以若您有用这三个选项的其中一个,只要 -fforce-addr 就够了。 * -fomit-frame-pointer o -fomit-frame-pointer, -fno-omit-frame-pointer o 若非必要,不将函式的 frame pointer 放进缓存器中。这将避免您的程序储存、设定、以及还原 framepointer;也在许多函式中省下一个缓存器。这个选项可能让某些平台上的除错工作变成不可能!。若平台支持不使用 frame pointer除错,这个选项将在 -O, -O2, -O3, -Os 中启动。 o 很抱歉,x86 刚好是非这个不可才能除错的平台之一。但是... 您想对您的桌面进行除错吗?若答案为非,您可以放心启动这个选项。 * -finline-functions o -finline-functions, -fno-inline-functions o 将所有简单的函式整合进呼叫他们的函式中。编译器会自动试探并决定那些函式值得被整合。于 -O3 时启动。 o 虽然这个选项会增加程序大小,但是他却是个增进效能的好东西。我建议您在这里启动它,然后使用下面一个指令指定 inline 条件。 * -finline-limit o -finline-limit=n o n 为决定函式是否能被 inline 的伪指令长度。预设的值为 600。 o 这个数值越小,程序启动的速度越快,但是运算的速度越慢。作为桌面使用,我建议 -finline-limit=400。 * -fmove-all-movables -freduce-all-givs o -fmove-all-movables, -fno-move-all-moveables -freduce-all-givs, -fno-redduse-all-givs o 这两个是循环最佳化技术,将无关循环内容的运算改在循环外执行。编译出的执行档可能更快也可能更慢,结果跟程序的写法有很大的关系。 o 虽然说效能跟程序写法有关,但是大部份的状况下这两个选项会做出比较小与比较快的程序代码,所以我建议您启动他们! * -freorder-blocks -freorder-functions o -freorder-blocks, -fno-reorder-blocks -freorder-functions, -fno-reorder-functions o 藉由重新编排程序区块来增进效能以及减少执行档大小。 o 这两个也是好东西,所以我建议您启动它们。缺点是会让编译时间变长。