导语:编译优化是通过编译技术获得性能提升的一类性能优化方法,它具有通用性和可持续性强的优势,一次投入后可长期保持稳定的优化效果,可以有效降低性能优化的成本。本文将回顾视频号推荐模块落地编译优化的历程和成果,也会介绍具体实践中遇到的问题和对应的解决方案,为后续同类应用提供参考。期待后续更多的业务模块能通过编译优化取得性能提升和成本收益。
我们把编译优化落地路径分为以下几类:
升级编译器
应用反馈编译优化(PGO/LTO)
应用LTO优化
上文提到的“objcopy --compress-debug-sections”
--compress-debug-section这个功能已经集成在gcc编译选项中,在链接的linker_flags中加入-gz选项可以实现同样的效果。
结论:微信后台二进制占比最大的部分是调试信息,通过压缩调试信息和链接优化,二进制尺寸从3.6GB缩小为800MB,减少将近80%。
视频号推荐模块的PGO优化方案包含了编译器升级(GCC7 -> GCC10)和选项优化(PGO)两部分内容,在实施过程中面临了比较多的问题。版本的升级一般来说都会带来各方面性能的提升,包括编译速度,运行速度,更高级的优化选项以及生成更高效的指令代码。但同时也可能高版本的编译器的检查选项更严格,有些以前没有暴露的错误被暴露出来,导致编译报错,有时是源代码本身的问题,也有些可能是编译器内部的问题,需要按照特定情况去解决。
在视频号模块上我们成功的实现了版本升级适配以及20%的综合性能提升,优化后的二进制文件大小减少了80%,显著的改进了部署效率。
[patch] lto: Don't run ipa-comdats pass during LTO
Optimize Options (Using the GNU Compiler Collection (GCC))
[RFC PATCH] ipa-visibility: Fix ICE in lto-partition caused by incorrect comdat group solving in ipa-visibility
[1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91257
[2] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96935
[3] https://gcc.gnu.org/pipermail/gcc-patches/2021-December/586302.html
[4] https://gcc.gnu.org/pipermail/gcc-patches/2023-March/614666.html
[5] https://en.cppreference.com/w/cpp/language/return
[6] https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
扫码添加 “鹅厂架构师小客服” ,加入【鹅厂架构师圈】,与技术爱好者、技术关注者分享交流,共同进步成长,欢迎大家!↓↓↓
关于我们
技术分享:关注微信公众号 【鹅厂架构师】