公司里 C++代码越来越多,修改一处代码,之后编译时间需要耗费十分钟以上。
由于编译过程是 一堆 Shell 脚本 + 各种 Makefile ,依赖错综复杂,不能直接利用 make 的增量编译。
我看中了 Ccache ( https://ccache.dev ),它可以伪装成 G++ 编译器,调用真正的 G++ 并将结果缓存至 ~/.ccache 。Ccache 遇到同样的编译后,直接返回缓存结果加快编译速度。
实测 Ccache 可以将这些代码编译时间压缩到两分钟。然而,我更关心 Ccache 是怎么判断代码未被更改,命中缓存的。
已知 Makefile 根据文件修改时间判断代码未被更改,这个感觉不太靠谱,而且 git 切到其他分支再回来,修改时间就变了。
所以判断代码是否更新这一点还是很重要的,做的不好会有以下副作用:
其中最担心的是第二点,更新了代码却使用缓存,那就不靠谱了。
有使用过 Ccache 的兄弟们欢迎交流~
1
Monad 2023-01-30 22:18:33 +08:00
印象里是预处理之后的文件内容。
|
2
missdeer 2023-01-30 22:21:23 +08:00
第 3 点不用担心,再慢也不会慢于 C++编译。scons 好像就是通过 md5 文件内容来判断的。
|
3
learningman 2023-01-30 22:31:06 +08:00 1
|
4
datocp 2023-01-31 07:08:24 +08:00 via Android
最近一直在编绎 openwrt ,对于大多数包都是有加速的,但是 openwrt 是先 clean 再 complie 遇到 mac80211 时间就相当长,感觉重新来了一遍。
|
5
datocp 2023-01-31 07:09:31 +08:00 via Android
主要是 mac80211 又拆成各种不同功能的 ipk 。
|
6
waruqi 2023-01-31 07:38:15 +08:00 via Android
大多数时候都是稳定的,原理就是根据预处理后的代码,计算 hash 来缓存 object file ,用于加速二次编译。
因为如果你代码没怎么改动,预处理的速度 一般比编译快很多,即使 rebuild 也能很快过掉。 你也可以尝试 xmake ,内置了 cache 机制,跨编译器和平台,完全不依赖 ccache 。编译非常快。 |
7
heiher 2023-01-31 09:11:42 +08:00 via Android 2
|
8
superares 2023-01-31 09:22:52 +08:00 via iPhone
|
9
lixile 2023-01-31 09:46:32 +08:00
Ccache 生效机制还跟底层文件系统有干涉(此处特指 zfs ,准确的说 truenas 上的 zfs )
一般来说 ccache 在 ci cd 领域是大量采用的,可以放心使用,另外如果宿主机的内存够大,可以切分部分内存出来作为 cache 的存储目录 另外 cache 可能需要定期清理,以保证良好的命中率,避免加速效果衰弱 |
10
ac23 2023-01-31 09:52:31 +08:00
腾讯开源了一个 yadcc ,老哥可以调研调研,不过只支持 linux 平台
|
11
my3157 2023-01-31 14:49:35 +08:00
clang-13 编译, 没缓存 8c16g vm 编译大概 105 min 左右, 加了 ccache, 大部分时候 15-30 min 就跑完了 , 提到的三点都没遇到, 反而由于 ccache 版本太低, 只支持按照文件大小逐出缓存, 高版本好像支持 ttl 了
|
12
lance0loong 2023-08-09 11:17:19 +08:00
目前已经在在生产环境中使用近一年,没出现过缓存错误问题.而缓冲机制靠的是,最后调用 gcc 或者 g++的参数和内容进行 cache.如果出现编译标记修订或者文件修订,将会重新编译,所以在使用 ccache 时,避免频繁修改编译标记.
|