Ccache 编译缓存靠谱吗?它根据什么条件判断是否命中缓存? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mikewang
V2EX    C++

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

  •  
  •   mikewang
    MikeWang000000 2023-01-30 22:15:00 +08:00 3332 次点击
    这是一个创建于 983 天前的主题,其中的信息可能已经有所发展或是发生改变。

    公司里 C++代码越来越多,修改一处代码,之后编译时间需要耗费十分钟以上。
    由于编译过程是 一堆 Shell 脚本 + 各种 Makefile ,依赖错综复杂,不能直接利用 make 的增量编译。

    我看中了 Ccache ( https://ccache.dev ),它可以伪装成 G++ 编译器,调用真正的 G++ 并将结果缓存至 ~/.ccache 。Ccache 遇到同样的编译后,直接返回缓存结果加快编译速度。

    实测 Ccache 可以将这些代码编译时间压缩到两分钟。然而,我更关心 Ccache 是怎么判断代码未被更改,命中缓存的。
    已知 Makefile 根据文件修改时间判断代码未被更改,这个感觉不太靠谱,而且 git 切到其他分支再回来,修改时间就变了。

    所以判断代码是否更新这一点还是很重要的,做的不好会有以下副作用:

    1. 判断条件不够精确,未更新当作更新了,缓存命中率低,慢;
    2. 判断条件不够精确,更新了当作未更新,使用缓存,编译结果不正确;
    3. 判断条件过于苛刻,全文 checksum 过慢,起不到加速效果。

    其中最担心的是第二点,更新了代码却使用缓存,那就不靠谱了。
    有使用过 Ccache 的兄弟们欢迎交流~

    第 1 条附言    2023-02-01 02:28:10 +08:00
    感谢大家~

    查文档
    看代码
    问V友

    其实也是顺带宣传一下 Ccache ,它真的是太快了
    12 条回复    2023-08-09 11:17:19 +08:00
    Monad
        1
    Monad  
       2023-01-30 22:18:33 +08:00
    印象里是预处理之后的文件内容。
    missdeer
        2
    missdeer  
       2023-01-30 22:21:23 +08:00
    第 3 点不用担心,再慢也不会慢于 C++编译。scons 好像就是通过 md5 文件内容来判断的。
    learningman
        3
    learningman  
       2023-01-30 22:31:06 +08:00   1
    datocp
        4
    datocp  
       2023-01-31 07:08:24 +08:00 via Android
    最近一直在编绎 openwrt ,对于大多数包都是有加速的,但是 openwrt 是先 clean 再 complie 遇到 mac80211 时间就相当长,感觉重新来了一遍。
    datocp
        5
    datocp  
       2023-01-31 07:09:31 +08:00 via Android
    主要是 mac80211 又拆成各种不同功能的 ipk 。
    waruqi
        6
    waruqi  
       2023-01-31 07:38:15 +08:00 via Android
    大多数时候都是稳定的,原理就是根据预处理后的代码,计算 hash 来缓存 object file ,用于加速二次编译。

    因为如果你代码没怎么改动,预处理的速度 一般比编译快很多,即使 rebuild 也能很快过掉。

    你也可以尝试 xmake ,内置了 cache 机制,跨编译器和平台,完全不依赖 ccache 。编译非常快。
    heiher
        7
    heiher  
       2023-01-31 09:11:42 +08:00 via Android   2
    superares
        8
    superares  
       2023-01-31 09:22:52 +08:00 via iPhone
    lixile
        9
    lixile  
       2023-01-31 09:46:32 +08:00
    Ccache 生效机制还跟底层文件系统有干涉(此处特指 zfs ,准确的说 truenas 上的 zfs )
    一般来说 ccache 在 ci cd 领域是大量采用的,可以放心使用,另外如果宿主机的内存够大,可以切分部分内存出来作为 cache 的存储目录
    另外 cache 可能需要定期清理,以保证良好的命中率,避免加速效果衰弱
    ac23
        10
    ac23  
       2023-01-31 09:52:31 +08:00
    腾讯开源了一个 yadcc ,老哥可以调研调研,不过只支持 linux 平台
    my3157
        11
    my3157  
       2023-01-31 14:49:35 +08:00
    clang-13 编译, 没缓存 8c16g vm 编译大概 105 min 左右, 加了 ccache, 大部分时候 15-30 min 就跑完了 , 提到的三点都没遇到, 反而由于 ccache 版本太低, 只支持按照文件大小逐出缓存, 高版本好像支持 ttl 了
    lance0loong
        12
    lance0loong  
       2023-08-09 11:17:19 +08:00
    目前已经在在生产环境中使用近一年,没出现过缓存错误问题.而缓冲机制靠的是,最后调用 gcc 或者 g++的参数和内容进行 cache.如果出现编译标记修订或者文件修订,将会重新编译,所以在使用 ccache 时,避免频繁修改编译标记.
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1157 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 23:30 PVG 07:30 LAX 16:30 JFK 19:30
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86