
sudo vim /etc/portage/make.conf:
COMMON_FLAGS="-march=native -O3 -pipe -finline-functions -fomit-frame-pointer -fno-stack-protector -fno-math-errno -fno-trapping-math -fno-common -fgraphite-identity -floop-nest-optimize -ftree-loop-distribution -fno-semantic-interposition -fipa-pta -fno-plt"
CFLAGS="${COMMON_FLAGS}"
CXXFLAGS="${COMMON_FLAGS}"
FCFLAGS="${COMMON_FLAGS}"
FFLAGS="${COMMON_FLAGS}"
LDFLAGS="${COMMON_FLAGS} -Wl,-O3 -Wl,--as-needed -Wl,--hash-style=gnu -Wl,--sort-common -Wl,--strip-all"
MAKEOPTS="-j6"
CPU_FLAGS_X86="aes avx avx2 f16c fma3 mmx mmxext pclmul popcnt sse sse2 sse3 sse4_1 sse4_2 ssse3" #我自己intel i5 8400支持的CPU指令集
CHOST="x86_64-pc-linux-gnu"
USE="lto pgo graphite -ssp"解释:
1.这是相对安全且稳健的gcc编译参数,我自己用这个编译参数emerge -e @world了整个系统,1268个包中只有6个编译不过,原因都是“-fno-common”这项参数,改为“-fcommon”后就都能编译过了。注意从最新的GCC 10版本以后开始,“-fno-common”将会默认开启,如果遇到编译不过的程序,请先改为“-fcommon”,再尝试编译试试看。
#还是不能编译过的,要么只保留“-march=native -O2 -pipe -finline-functions -fomit-frame-pointer”;要么就换用clang编译器来编译程序,具体方法见——
https://wiki.gentoo.org/wiki/Clangwiki.gentoo.org2.我在USE flags里设置了“-ssp”把gcc的编译器堆栈保护技术(SSP: Stack smashing protection)关闭了,再进一步在gcc CFLAGS中指定了“-fno-stack-protector”,从而禁用二进制程序的堆栈保护功能。这是一项以牺牲程序安全性为代价换取性能的设置,在意系统安全性的同学请不要这样设置。
3.通过在USE flags里指定“graphite”和在gcc CFLAGS中指定“-fgraphite-identity”,可开启gcc编译时的Graphite优化,这样设置不会干扰gcc本身在编译程序时的优化判断。
4.在USE flags里指定“lto pgo”可以让gcc支持编译程序时启用lto优化(link time optimization)和pgo优化。但是我的gcc CFLAGS没有指定这两项优化;尤其是lto优化,开启了后很多包都不能成功编译,即便能成功编译,程序也会运行异常、出现迷之行为。
5.USE flags里的“lto pgo graphite”是gcc本身的功能标记,指定后需要先重新emerge gcc,以编译出支持这三项优化功能的gcc来。
6.“-fomit-frame-pointer”会导致编译出来的程序无法debug,所以程序员的用户请注意了。
7.“-fno-math-errno -fno-trapping-math”是两项相对安全的浮点运算加速优化参数。
8.LDFLAGS里的参数都是比较安全的,“-Wl,--strip-all”可以减小程序体积。
9.极少数程序用“-fno-plt”无法编译过,请把这项删掉后再尝试编译。
评价:
1.gcc的编译优化并不会带来明显的性能提升,但是会以耗费一整天的时间来emerge -e @world作为代价。觉得麻烦没意义的,就老老实实地用“-march=native -O2 -pipe”三连吧~~LDFLAGS里的参数可以照搬,是安全的。
2.gcc编译优化的效果不如kernel内核配置优化的效果那么明显,内核优化后能感受得到桌面响应速度和流畅度的提升。所以与其耗费那么多的时间去编译,不如好好配置定制优化下自己的内核。
3.内核优化最明显的一个例子是:我用dolphin模拟器玩wii主机的游戏《零:真红之蝶》,在相同的模拟器设置下,用genkernel出来的内核最高只能开到720p的画质,而且游戏里不少复杂场景会有卡顿,画面帧数波动较大;而用我自己配置优化的内核,可以直接开1080p的画质,且游戏全程流畅运行,几乎没有卡顿,画面帧数非常平稳,实在是一种享受。
4.所以可见,一个精心定制优化的内核配置,能让你的电脑使用周期延长2-3年,这不是很值得吗?!
5.gcc编译优化编译优化是一门玄学,过多的、激进的优化参数不一定会带来良好的性能提升,但可能破环二进制程序,导致编译不过。Intel自家的clear linux已经在这条邪道上越走越远了,感兴趣的同学可以去试试,地球上性能最强的linux发行版。
后记:
之前写过一篇文章《Gentoo激进的优化编译方案》,我觉得很不合适。第一是这些参数实在是太过激进了,如果没有按照GentooLTO项目里的步骤来设置,只是单纯地把里面的优化参数copy到CFLAGS里,我发现只有极少数几个包能成功编译,系统里绝大多数包都是不能编译过去的;第二是不想盲从GentooLTO项目里的步骤,不明不白地就踏上了别人设计好的“贼船”。因此,在仔细阅读并查阅了GentooLTO里各项优化参数的说明后,我决定更新一篇相对适中、安全的优化参数文章,只是作为分享。所以之前的文章我打算删掉了,我个人建议大家也没必要花费时间按照GentooLTO里的来优化,我觉得适中、安全的优化参数已经是足够了,没必要再折腾。
由于我是非计算机专业的爱好者,gcc编译程序的原理和机制、gcc参数的意义这些我都无法很准确地理解。我是一个“拿来主义者”,所以众人说好用、有用、安全的东西,我也就拿来用了,如有不准确的地方,计科专业的大佬们勿喷,还请温柔地指出,谢谢!码字不易
我写这些文章的目的,其一就是为了分享自己的经验和想法,以及希望让更多人看到,引起他们的兴趣,来一起折腾Gentoo,从而变象推广Gentoo;其二是为了给自己留作备份,毕竟“好记心不如烂笔头”,耗费这么多时间摸索出来的步骤和经验要是忘记了可就糟了。我喜欢Linux,我喜欢Gentoo,它让我在电脑和操作系统上体验到了前所未有的自由度。
还是那句话——“开源世界你我她,社区发展靠大家”,所以只知伸手索取不知分享贡献的态度是不对的哦~~
参考:
gentooLTOwww.worldlink.com.cn https://github.com/InBetweenNames/gentooLTO/wikigithub.com https://github.com/InBetweenNames/gentooLTO/blob/master/sys-config/ltoize/files/make.conf.lto.definesgithub.com另附:
1.我的grub内核引导优化参数——
sudo vim /etc/default/grub:
GRUB_CMDLINE_LINUX_DEFAULT="scsi_mod.use_blk_mq=1 nmi_watchdog=0 intel_iommu=igfx_on i915.fastboot=1 intel_idle.max_cstate=0 processor.max_cstate=1 spectre_v1=off spectre_v2=off spec_store_bypass_disable=off pti=off i915.enable_guc=2 zswap.enabled=1 zswap.compressor=lz4 snd_hda_intel.probe_mask=1 iwlwifi.swcrypto=0 iwlwifi.11n_disable=8 iwlwifi.lar_disable=1 iwlwifi.enable_ini=0 iwlwifi.bt_coex_active=1 iwlwifi.power_save=0 iwlwifi.fw_monitor=0"
sudo grub-mkconfig -o /boot/grub/grub.cfg2.每个星期记得执行一遍这个命令,以优化SSD硬盘的性能、延长SSD的使用寿命——
sudo fstrim -v /