ccache(compiler cache的缩写)是一个编译器缓存,该工具会高速缓存编译生成的信息,并在编译的特定部分使用高速缓存的信息, 比如头文件,这样就节省了通常使用 cpp 解析这些信息所需要的时间。
ccache原理是通过把项目的源文件用ccache编译器编译,然后缓存编译生成的信息,从而在下一次编译时,利用这个缓存加快编译的速度,目前支持的语言有:C、C++、Objective-C、Objective-C++。
github :https://github.com/ccache/ccache
home:https://ccache.dev/
经测试,distclean 后,重新编译时间从2:40 减少到1:30
修改部分文件后编译由40s提升到30s (不固定)
- 查看编译时间
- 使用
time build command
可以查看执行build command
命令所需的时间 - 首先
build command distclean
清理中间文件 - 执行
time build command
查看完全编译所需的时间。
- 使用
- 安装ccache
sudo apt-get install ccache
- 配置ccache
执行下面命令,使用ccache
替代gcc
等编译工具
mkdir ~/.ccache_bin
cd ~/.ccache_bin/
ln -s /usr/bin/ccache gcc
ln -s /usr/bin/ccache g++
ln -s /usr/bin/ccache cc
ln -s /usr/bin/ccache c++
修改环境变量
vim ~/.bashrc
//添加下面一行到 ~/.bashrc 最后一行
export PATH=$HOME/.ccache_bin:$PATH
//更新环境变量
source ~/.bashrc
检查配置,输入命令,检查使用的编译器是否为~/.ccache_bin/gcc
,是则配置完成,否则检查环境变量是否配置成功which gcc
。
- 使用ccache
- 首次执行时,需要使用distclean清理中间文件,然后使用
time build command
进行编译 - 编译完成后 ,可通过
ccache -s
查看当前已缓存文件数
- 再次编译时,会自动选择文件缓存,再次使用
ccache -s
可以查看文件缓存的命中率
接下来,我们来了解一下ccache的原理:
使用编译器高速缓存工具complier cache(ccache)来加快编译速度,如果你经常make clean
,
ccache能大大缩短再次编译的时间。可以通过设置以下命令来启用ccache。可以将该环境变量写入.bashrc或类似文件,避免每次都设置。
$ export USE_CCACHE=1
默认cache存储在~/.ccache. 可以使用下列命令来设置路径
$ export CCACHE_DIR=<path-to-your-cache-directory>
推荐的cache大小为50-100GB. 可以使用下列命令来设置cache size
$ prebuilt/linux-x86/ccache/ccache -M 50G (工程目录下运行)
该设置会永久存储在CCACHE_DIR
可以使用以下命令来查看ccache的运行状况:
$ watch -n1 -d prebuilt/linux-x86/ccache/ccache -s (工程目录下运行)
目前在我们的项目中已经设置有ccache,但cache size 偏小,可以重新设置一下cache size即可。
原理简介:
ccache 工具通过将头文件高速缓存到源文件之中而改进了构建性能,因而通过减少每一步编译时添加头文件所需要的时间而提高了构建速度
在标准的编译过程中,在 UNIX 下使用 C/C++ 开发应用程序通常需要用到一个编译器(如 gcc)以及一个编译工具,比如 make。make 和所有的 C 编译器的问题在于 C 预处理程序(preprocessor)和头文件的工作方式。观察一个典型的 C 源文件,您会发现其中有很多由 #include 所引用的各种头文件。
每一次编译一个文件时,C 预处理程序(cpp)都会解析并引入每个头文件以及这些头文件引用到的任何文件。通过对内容进行解析,ccp 可以将一个相当基本的 1-KB 大小的源文件转化为一个 8-KB 大小的源文件,在这个过程中,会合并入几十个甚至几百个头文件。在典型的开发项目中,有很多与项目相关的头文件可能会在不同的源文件中多次被引入,而且每个头文件本身也可能引用很多其他头文件。
在典型的编译过程中,make 工具只编译自上次编译后发生修改的文件,这样就在很大程度上简化了编译过程。
make 将必须被编译的文件限制在经过修改的那些源文件范围之内,但是即使是使用 make,仍然有相当可观的浪费。每一次编译项目时,源文件在编译为汇编语言和最终的机器代码之前,都要通过 cpp 进行解析。对每一个文件来说,每一次可能都要重新解析头文件。从编译的全过程来看,您最后可能多次解析了相同的头文件,浪费了处理器周期,更重要的是浪费了开发者的时间,因为他们要等待这一过程的完成。在一个团队中,这一影响可能会更为明显,
因为多名开发者可能都会反复多次重复这一过程,在某一天甚至可能会同时进行。
ccache(“compiler cache”的缩写)工具会高速缓存编译生成的信息,并在编译的特定部分使用高速缓存的信息,比如头文件,这样就节省了通常使用 cpp 解析这些信息所需要的时间。如果您编译清单 2 中的文件,假定 foobar.h 中包含对其他头文件的引用,ccache 会用那个文件的 cpp-parsed 版本来取代 include 声明。就那么简单。不是真正去读取、理解并解释其内容,ccache 只是将最终的文本拷贝到文件中,使得它可以立即被编译。
清单 2. 源文件内容
#include "foobar.h"
void main(void);