Ccache 编译缓存靠谱吗?它根据什么条件判断是否命中缓存?

查看 97|回复 3
作者:mikewang   
公司里 C++代码越来越多,修改一处代码,之后编译时间需要耗费十分钟以上。
由于编译过程是 一堆 Shell 脚本 + 各种 Makefile ,依赖错综复杂,不能直接利用 make 的增量编译。
我看中了 Ccache ( https://ccache.dev ),它可以伪装成 G++ 编译器,调用真正的 G++ 并将结果缓存至 ~/.ccache 。Ccache 遇到同样的编译后,直接返回缓存结果加快编译速度。
实测 Ccache 可以将这些代码编译时间压缩到两分钟。然而,我更关心 Ccache 是怎么判断代码未被更改,命中缓存的。
已知 Makefile 根据文件修改时间判断代码未被更改,这个感觉不太靠谱,而且 git 切到其他分支再回来,修改时间就变了。
所以判断代码是否更新这一点还是很重要的,做的不好会有以下副作用:
[ol]
  • 判断条件不够精确,未更新当作更新了,缓存命中率低,慢;
  • 判断条件不够精确,更新了当作未更新,使用缓存,编译结果不正确;
  • 判断条件过于苛刻,全文 checksum 过慢,起不到加速效果。
    [/ol]
    其中最担心的是第二点,更新了代码却使用缓存,那就不靠谱了。
    有使用过 Ccache 的兄弟们欢迎交流~

    ccache, 代码, 编译, 判断

  • Monad   
    印象里是预处理之后的文件内容。
    missdeer   
    第 3 点不用担心,再慢也不会慢于 C++编译。scons 好像就是通过 md5 文件内容来判断的。
    learningman   
    https://github.com/ccache/ccache/blob/master/src/ccache.cpp#L1191-L1270
    代码又不多,自己找找呗。。。
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部