C++ 提高编译速度 (二) 解决方案实现 | 预编译头 多核编译

优化思路可以参考上一篇文章 : C++ 提高编译速度(一) GCC预编译头

本篇介绍一下我实现的工具,用于整理预编译头文件

代码地址:https://github.com/wangxiaobai-dd/Compilation/tree/main/GchTool  

在应用gch时,我的方法是:

  1. 先使用了include-what-you-use 这个开源工具,去除重复包含的头文件(也是一种优化)
  2. 分析路径下头文件的包含频率
  3. 筛选包含频率高但是改动频率小头文件,放在新的inc.h文件中
  4. 剔除cpp文件包含的上一步的头文件,并在cpp中首行插入#include “inc.h”
  5. 修改Makefile,修改依赖关系,编译时先对inc.h进行编译,生成最新的inc.h.gch

从第二步开始 ,以我的仓库里的代码举例 ,GchTool/TestTool/dirA.bak 是预编译头优化前, dirA 是优化后 ,大家可以对比参考

  • 分析路径下头文件包含频率:  CheckInclude.cpp   

使用:  ./CheckInclude TestTool/dirA 

生成 analyseInc.txt  , 供 ReplaceGCH.sh 脚本使用:

 analyseInc2.txt ,方便我们自己查看头文件包含频率 :

  • 可以根据 git 或者 svn 提交记录,手动从 analyseInc.txt 剔除改动频率大的头文件,(头文件包含应是递归包含的,当时没有考虑到嵌套问题)

  • 使用预编译头替换脚本 ReplaceGch.sh  

使用:./ReplaceGCH.sh TestTool/dirA/ 3     取 analyseInc.txt  前 3 头文件,对 dirA 路径下,将这些头文件从 cpp 文件中删除,新建文件 inc.h 用于包含这些头文件,并且将 #include "inc.h" 插入刚才修改的 cpp 文件的首行

要处理的头文件数量,根据我们的实际项目规模来确定,这里举例是 3 

向受到影响的 cpp 文件 插入 inc.h ,会调用 InsertInc 脚本:

从受到影响的 cpp 文件 剔除 analyseInc.txt 前 N 的头文件 include "xxxxx" :

   -> 

创建 inc.h :

    -> 

  • 修改 Makefile 

修改 dirA/Makefile 依赖,保证每次编译先对 inc.h 进行编译 生成 inc.h.gch

修改 项目Makefile,支持多核编译(目录间多核,比如 dirA 对 inc.h 编译生成 inc.h.gch 时,其他目录仍然在编译):

这里 targetA 是公共库目录 ,targetB、targetC 都要依赖 targetA,如 targetA 生成的静态库

对 inc.h 包含的头文件递归检查,刷新 inc.h 的时间戳,促使生成新的 inc.h.gch (比如inc.h 包含 common.h ,我们对 common.h 修改,gcc 并不认为 inc.h 有改动,因此我编写了脚本 gchcheck.py 做编译前检查):

Makefile:

gchcheck.py:

  • make -jN  编译 ,大功告成

效果:在我们的项目(200万代码量+),我选择了代码比较多的三个目录进行预编译头优化(进行上述一系列操作,另外: 将小的编译单元合并成大的编译单元也是有效的 可参考上一篇文章,如 com.cpp 包含 a.cpp b.cpp , 在com.cpp 中首行也需要 #include "inc.h" ),编译时间从 24min30s左右 降到 14min 左右 ,节省 40%以上 编译时间。

后续: 在下一篇文章中,介绍对 gcc 编译的输出进行整理,友好的多核编译显示界面   C++ 提高编译速度(三) 友好的编译信息输出 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值