C++服务编译耗时优化原理及实践( 六 )


C++服务编译耗时优化原理及实践

文章插图
 
4.3 优化效果
我们通过32C、64G内存机器做了编译耗时优化前后的效果对比,统计结果如下:
C++服务编译耗时优化原理及实践

文章插图
 

C++服务编译耗时优化原理及实践

文章插图
 
4.4 守住优化成果
编译优化是一件“逆水行舟”的事情,开发人员总是倾向于不断增加新的功能、新的库乃至新的框架,而要删除旧代码、旧库、下线旧框架总是困难重重(相信一线开发人员一定深有体会) 。因此,如何守住之前取得的优化成果也是至关重要的 。我们在实践中有以下几点体会:
  • 代码审核是困难的(引起编译耗时增加的改动,往往无法通过审核代码直观地发现) 。
  • 工具、流程才值得依赖 。
  • 关键在于控制增量 。
我们发现,cpp文件的编译耗时,和其预编译展开文件(.ii)大小呈正相关(绝大部分情况下);对每一个上线版本,将其所有cpp文件的预编译展开大小记录下来,就形成了其编译指纹(CF,Compile Fingerprint) 。通过比较相邻两个版本的CF,就能较准确的知道新版带来的编译耗时主要由哪些改动引入,并可以进一步分析耗时上涨是否合理,是否有优化空间 。
我们将该种方式制作成脚本工具并引入上线流程,从而能够很清楚的了解每次代码发版带来的编译性能影响,并有效地帮助我们守住前期的优化成果 。
五、总结DQU项目是美团搜索业务环节中重要的一环,该系统需要对接20+RPC、数十个模型、加载超过300个词典,使用内存数十G,日均响应请求超过20亿的大型C++服务 。在业务高速迭代的情况,冗长的编译时间为开发同学带来较大的困扰,一定程度上制约了开发效率 。最终我们通过编译优化分析工具建设,结合采用了通用编译优化加速方案和代码层面的优化,将DQU的编译时间缩短了70%,并通过引CCache等手段,使得本地开发的编译,能够在100s内完成,给开发团队节省了大量的时间 。
在取得阶段性成果之后,我们总结整个问题解决的过程,并沉淀出一些分析方法、工具以及流程规范 。这些工具在后续的开发迭代过程中,能够快速有效地检测新的代码变更带来的编译时间变化,并成为了我们的上线流程检查中的一环检测标准 。这一点与我们以往一次性的或者针对性的编译优化,产生了很大的区别 。毕竟代码的维护是一个持久的过程,系统化的解决这一问题,不只是需要有效的方法和便捷的工具,更需要一个标准化的,规范化的上线流程来保持成果 。希望本文对大家能有所帮助 。
作者简介周磊,识瀚,朱超,王鑫,刘亮,昌术,李超,云森,永超等,均来自美团AI平台搜索与NLP部 。

【C++服务编译耗时优化原理及实践】


推荐阅读