背景
项目规模大概是200万行代码,使用g++编译,但是速度较慢,尝试进行了一些编译速度优化的研究,取得一些效果,这里总结分享一下。
方法
1. 梳理编译单元
编译时,我们每一个cpp文件将会生成对应的一个.o目标单元,将小的编译单元合并成大的编译单元对编译速度会有显著的提升。
类似上图,用n.cpp 包含 a.cpp,b.cpp,用m.cpp包含c.cpp,d.cpp,将 4 个编译单元变成 2 个编译单元。
注意,这里我认为应该将修改频率低的文件进行编译单元合并,如果将高修改频率的cpp文件放入合并后的编译单元,那么每次修改这个文件都会导致包含这个大编译单元重新编译。
另外,合并的编译单元尽可能地有一定关联度,可以按照业务功能来划分,或者通过一些数据统计来划分。
2. 应用gcc预编译头
按照图2,当a,cpp b.cpp c.cpp都包含temp.h头文件时,在编译的时候,temp.h会被解析三遍,分别与a,b,c结合生成.o文件。这样我们可以预先对头文件进行编译,生成temp.h.gch文件,这样只需要解析一次temp.h,原来的a.cpp,b.cpp,c.cpp文件仍然include temp.h就好了,只是要最先包含temp.h。
编译时 -H 可以看到cpp文件的依赖信息,应用gch后 !temp.h.gch
在应用gch时,我的方法是:
- 先使用了include-what-you-use 这个开源工具,去除重复包含的头文件(也是一种优化)
- 分析路径下头文件的包含频率
- 筛选包含频率高但是改动频率小的头文件,放在新的inc.h文件中
- 剔除cpp文件包含的上一步的头文件,并在cpp中首行插入#include “inc.h”
- 修改Makefile,修改依赖关系,编译时先对inc.h进行编译,生成最新的inc.h.gch
解决方案实现: