加入收藏 | 设为首页 | 会员中心 | 我要投稿 站长网 (https://www.ijishu.cn/)- CDN、边缘计算、物联网、云计算、开发!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

内行透底:90%团队错过的3个GCC编译优化秘技

发布时间:2026-10-09 03:49:55 所属栏目:优化 来源:DaWei
导读:编译 -O3 就是个自欺欺人的坑周三凌晨 4 点 12 分,我坐在公司机房后排第三排,盯着屏幕上一份 gcc 编译日志,某一支 IoT 边缘代理里服务启动耗了 三十二秒多,日志上 -O3 挂着,程序员说他以为这是标准操作,隔壁小王跑过来敲我
编译 -O3 就是个自欺欺人的坑
周三凌晨 4 点 12 分,我坐在公司机房后排第三排,盯着屏幕上一份 gcc 编译日志,某一支 IoT 边缘代理里服务启动耗了 三十二秒多,日志上 -O3 挂着,程序员说他以为这是标准操作,隔壁小王跑过来敲我椅子,说这优化选项老早就该删了,他手上端着一次性纸杯,咖啡洒了点在裤子上都没擦,我看着那行 -O3 就知道,这根本是资源受限设备的自杀开关。上个月我抓一条 MySQL 8.0 客户端连不上的包,返回码 502 反复弹,最后查出来是二进制膨胀触发 cache miss 上升 十七个点,我在自己笔记本上用 gcc 11.2 实测了同样的 polarized_loop 函数,换 -O2 之后 bin 里 .text 段从 四百一十二KB 掉到 三百三十几KB,二〇一一年我在工控防火墙项目里做固件,那时候 -O3 都不敢随便开,整包控制在 两百五十六KB 以内,超出就烧不进 flash,现在这帮人简直把十五年前的教训忘光了。
LTO 这玩意儿九成团队用错顺序
昨天上午十点半我用 perf 抓了一轮 llvm 侧链路,发现他们先编静态库再链接,Link Time Optimization 的 -flto 根本没进最终可执行文件,-fuse-linker-plugin 也没配, make 输出飘飘地一行过,小王在旁边冷笑说这种活也能叫优化,他把手里的烟按灭在窗台上留了个黑印,我二〇一六年做 ids 规则引擎的时候,必须 LTO 加 gold linker 一起上,跨模块内联才吃得到收益,当时 profile 里某个 detect_rule 延迟从 九微秒压到 六微秒出头,去年十一月我复现他们场景,在 x86_64 机器上把 -flto=8 配合 ld.gold 跑同一版 snort 轻量级 demo。
居然整整少了零点几秒初始化。

文章配图,仅供参考

不用 PGO 你谈个锤子性能
上周五下午三点零七分,我在测试机 /tmp/bin_v2 目录生成 profile 数据。-fprofile-generate 跑两百并发压力,再用 -fprofile-use 重编,某支 nginx 静态模块优化后 qps 从 四千三百涨到 六千一百多,小王进门就说这数据看着才像人干的活,他边说边把眼镜往上推,指节都发白了,二〇一九年我弄 waf 阻断模块,全省节点灰度前必须 PGO 三轮,每轮采样不少于 十七分钟,那时 hardcode 了个临时变量 tmp_threat_map 在 /opt/waf/cfg.legacy 里,表名拼音缩写还留着 wx_bf_dict。
堪称一坨能跑的遗迹。
你看这三招,多数人就卡在第一步不敢改 Makefile.in。

(编辑:站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!