怎么提高 C++项目编译速度 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
thiiadoewjwe
V2EX    程序员

怎么提高 C++项目编译速度

  •  
  •   thiiadoewjwe 2023-08-23 20:25:28 +08:00 4720 次点击
    这是一个创建于 780 天前的主题,其中的信息可能已经有所发展或是发生改变。

    公司的 C++项目编译每次都要 30 分钟左右

    自己最近在网上看,有发现类似的解决方案,比如谷歌的筛选重复头文件,还有一个付费加快编译的,还有 ccache 等

    但是有没有 VS 可以直接拿来就用的加快编译的工具呢,或者大家是有什么巧妙的方法吗

    从写代码来说,公司已经成屎山了,不会改代码的

    43 条回复    2023-08-25 17:35:51 +08:00
    tool2d
        1
    tool2d  
       2023-08-23 20:37:36 +08:00
    少用模板,模板到后期就是会拉垮编译速度。

    把 C++当成 C 来用,编译速度原地起飞。
    ysc3839
        2
    ysc3839  
       2023-08-23 20:39:38 +08:00 via Android
    VS 的话应该默认就有增量编译?确认一下编译时是单独编译了有改动的文件,还是怎样?以及是在编译 obj 时慢还是链接时慢?
    cleveryun
        3
    cleveryun  
       2023-08-23 20:45:13 +08:00 via Android
    mark 一下,最近开始接触一个 c++项目,之前一直写 web 前端。
    edimetia3d
        4
    edimetia3d  
       2023-08-23 20:50:06 +08:00
    道理上就是分布式, 预编译, 预链接, 缓存. 项目构建系统需要开发和 IT 一起来维护了, 容易吃力不讨好的.

    以前用过 incredibuild, 全公司开发机都强制贡献至少 1 个核, 好像不错.

    linux 下都是开发服务器了, 256 core 2T 内存起步, 大力出奇迹.
    HannibaI
        5
    HannibaI  
       2023-08-23 20:50:15 +08:00   2
    ccache/sccache
    distcc
    unity build
    precompiled header
    framlog
        6
    framlog  
       2023-08-23 20:51:07 +08:00
    楼上很全了
    Puteulanus"
        7
    Puteulanus  
       2023-08-23 21:00:00 +08:00
    ccache 感觉不错,编译 OpenWrt 的时候第二遍重复编译比第一遍快老多了
    zzzkkk
        8
    zzzkkk  
       2023-08-23 21:03:45 +08:00 via Android
    @edimetia3d
    linux 都是开发服务器 什么意思?
    edimetia3d
        9
    edimetia3d  
       2023-08-23 21:13:54 +08:00
    @zzzkkk 就是直接用一个很强的服务器做开发机, 几十个人共用.
    pengtdyd
        10
    pengtdyd  
       2023-08-23 21:23:21 +08:00
    重构,用新技术
    jmc891205
        11
    jmc891205  
       2023-08-23 22:06:05 +08:00
    我们都是分布式编译
    提交到集群上编译
    allAboutDbmss
        12
    allAboutDbmss  
       2023-08-23 22:12:19 +08:00
    借楼问一下: rust 有这些 cmake 的问题吗?
    richangfan
        13
    richangfan  
       2023-08-23 22:35:30 +08:00
    上双路 EPYC
    cnbatch
        14
    cnbatch  
       2023-08-23 22:51:16 +08:00
    @allAboutDbmss 编译速度关 cmake 什么事?
    ivvei
        15
    ivvei  
       2023-08-23 23:02:59 +08:00
    慢一般就慢在模板上……
    yaott2020
        16
    yaott2020  
       2023-08-23 23:32:43 +08:00 via Android
    正在等 rust 编译顺便来刷刷 v 站
    yaott2020
        17
    yaott2020  
       2023-08-23 23:33:03 +08:00 via Android
    小项目,等 debug 启动中。。。
    lance6716
        18
    lance6716  
       2023-08-23 23:36:08 +08:00 via Android
    打开 v 站搜索“我为什么放弃 go”,看看编译速度快是一件多么微不足道的小事来平衡一下
    learningman
        19
    learningman  
       2023-08-24 01:55:37 +08:00 via Android
    @allAboutDbmss rust 有神奇的 build.rs
    dangyuluo
        20
    dangyuluo  
       2023-08-24 04:01:16 +08:00
    IWYU 去掉重复投文件,然后就是模版不要太多层。有人说 forward declaration ,但是我觉得加快的速度无法冲抵带来的麻烦。
    ghostheaven
        21
    ghostheaven  
       2023-08-24 04:11:39 +08:00
    如果是 link 的时间长只能考虑增加内存和主频,其他的考虑 io 性能,搞个停产的傲腾说不定会快不少
    Soo0
        22
    Soo0  
       2023-08-24 04:15:13 +08:00 via iPhone
    大力出奇迹?
    Weixiao0725
        23
    Weixiao0725  
       2023-08-24 04:52:32 +08:00   1
    make -j 8
    XiaoyehuaDev
        24
    XiaoyehuaDev  
       2023-08-24 08:34:27 +08:00 via iPhone
    cmake 增量编译吧,每次从头开始编译是这样的
    VDarker
        25
    VDarker  
       2023-08-24 09:00:19 +08:00
    incredibuild 效果很不错 就是付费
    免费可以自己研究下 fast build 这个项目 开源的
    cslive
        26
    cslive  
       2023-08-24 09:17:40 +08:00
    大力出奇迹,加配置
    kingzeus
        27
    kingzeus  
       2023-08-24 09:47:59 +08:00
    水平扩容,并行编译
    iamqk
        28
    iamqk  
       2023-08-24 10:49:51 +08:00
    预处理经常改的话就要移出来做普通文件
    编译环境要用 ramdisk 提升 io 性能
    lsongzhi
        29
    lsongzhi  
       2023-08-24 10:55:06 +08:00
    sccache + mold
    bfdh
        30
    bfdh  
       2023-08-24 10:58:26 +08:00
    歪个楼,换台性能高的编译服务器。
    FrankHB
        31
    FrankHB  
       2023-08-24 15:05:55 +08:00
    VS 自带 IncrediBuild ,不过不顺手我不用。
    然后是预编译头文件。
    还有 mozilla 那种 unified build ,不过不是所有源码都能用。
    剩下无非的加机器和 ramdisk 这种通用的,以及不要用太耗时间的优化(不过 cl/link 这块还好)。
    限制 VS 其实多少得自求多福了。否则 gch/ccache/sccache 那套明显更舒服。GNU ld 特别慢还可以用 lld 或者 mold 。
    @lance6716 要不得不用到自己魔改的 go toolchain 照样会吃亏。
    DoWnH
        32
    DoWnH  
       2023-08-24 15:49:10 +08:00
    Golang 的初衷之一就是解决 cpp 编译过慢的问题
    encro
        33
    encro  
       2023-08-24 17:00:46 +08:00
    为啥没有人提架构上的那一套。Ninja 之类的?
    还有就是模块化,没改动的就不编译?
    已经 30 分钟,肯定是以上两种方法,以及多线程等方法能明显提效啊。

    我是 C++入门选手,如果不对请告诉我。
    gejigeji
        34
    gejigeji  
       2023-08-24 20:06:58 +08:00
    make -j 128
    yuruizhe
        35
    yuruizhe  
       2023-08-24 20:39:26 +08:00
    @tool2d 那直接用 C 不就好了,何必用 cpp
    Thymolblue
        36
    Thymolblue  
       2023-08-24 21:01:21 +08:00 via Android
    歪个楼,目前的项目里引用了 Eigen3 ,编译时间直接增加了 5 分钟。看了一下 cpu 的消耗,只有一个核跑满了,其他核占用基本是 0 ,但是实际是配置了多核编译的。这种如何加速编译呢?
    touchmii
        37
    touchmii  
       2023-08-24 21:10:21 +08:00 via Android
    先用 ninja 试一下能否提高编译速度,效果不明显就分析下源文件和模板文件的数量,判断编译时间主要消耗在哪里,如果 CPU 核心数加不了试一下 xmake 支持多分布式编译,把任务发送到多台主机编译,最后代码架构的前后关联性可能会影响多线程编译,这种情况就别折腾了,买个咖啡机比较合适。
    8675bc86
        38
    8675bc86  
       2023-08-24 21:14:12 +08:00
    啥项目编译一次 30 分钟,都没人想着加速??
    这团队有点烂。
    thiiadoewjwe
        39
    thiiadoewjwe  
    OP
       2023-08-24 22:37:07 +08:00
    @8675bc86 国企,都瞎开发,还用的是 MFC
    lixile
        40
    lixile  
       2023-08-25 13:50:31 +08:00
    建议 回复代码量级 和目前的编译机器配置
    上面已经说了很多了 我说个更原始的
    如果 30 分钟内 机器并非满载 甚至负载不高 那就是编译脚本 makefile 或者 cmake 没有写好编译依赖导致的
    其次是 第三方库全部拆出去预编译 不要重复编译
    剩下的就是加配置 加 cache 之类的操作了
    整套下来 需要相对系统的处理
    lixile
        41
    lixile  
       2023-08-25 13:52:16 +08:00
    @Thymolblue 盲猜 传递的给 eigen3 的编译命令 是 make
    而不是 make -j8 -j16 之类的
    也不是正统学院 or 工程派的 $(MAKE)
    其实看看 jobserver 有没有提示报错 或者 warn 基本上就能有结论
    8675bc86
        42
    8675bc86  
       2023-08-25 14:45:23 +08:00
    @thiiadoewjwe MFC 赢了,还不提桶跑路,MFC 编译加速不好搞。
    chji5471
        43
    chji5471  
       2023-08-25 17:35:51 +08:00
    我们项目是自动生成几个 cpp 文件,然后 cpp 文件包含具体实现的 cpp 文件,感觉能加快不少
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1009 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 18:42 PVG 02:42 LAX 11:42 JFK 14:42
    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