V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
thiiadoewjwe
V2EX  ›  程序员

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

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

    公司的 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   ❤️ 1
    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
    xipuxiaoyehua
        24
    xipuxiaoyehua  
       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   ·   实用小工具   ·   3384 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 11:13 · PVG 19:13 · LAX 03:13 · JFK 06:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.