V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
thiiadoewjwe
V2EX  ›  程序员

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

  •  
  •   thiiadoewjwe · 248 天前 · 3503 次点击
    这是一个创建于 248 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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