公司的 C++项目编译每次都要 30 分钟左右
自己最近在网上看,有发现类似的解决方案,比如谷歌的筛选重复头文件,还有一个付费加快编译的,还有 ccache 等
但是有没有 VS 可以直接拿来就用的加快编译的工具呢,或者大家是有什么巧妙的方法吗
从写代码来说,公司已经成屎山了,不会改代码的
1
tool2d 2023-08-23 20:37:36 +08:00
少用模板,模板到后期就是会拉垮编译速度。
把 C++当成 C 来用,编译速度原地起飞。 |
2
ysc3839 2023-08-23 20:39:38 +08:00 via Android
VS 的话应该默认就有增量编译?确认一下编译时是单独编译了有改动的文件,还是怎样?以及是在编译 obj 时慢还是链接时慢?
|
3
cleveryun 2023-08-23 20:45:13 +08:00 via Android
mark 一下,最近开始接触一个 c++项目,之前一直写 web 前端。
|
4
edimetia3d 2023-08-23 20:50:06 +08:00
道理上就是分布式, 预编译, 预链接, 缓存. 项目构建系统需要开发和 IT 一起来维护了, 容易吃力不讨好的.
以前用过 incredibuild, 全公司开发机都强制贡献至少 1 个核, 好像不错. linux 下都是开发服务器了, 256 core 2T 内存起步, 大力出奇迹. |
5
HannibaI 2023-08-23 20:50:15 +08:00 1
ccache/sccache
distcc unity build precompiled header |
6
framlog 2023-08-23 20:51:07 +08:00
楼上很全了
|
7
Puteulanus 2023-08-23 21:00:00 +08:00
ccache 感觉不错,编译 OpenWrt 的时候第二遍重复编译比第一遍快老多了
|
8
zzzkkk 2023-08-23 21:03:45 +08:00 via Android
@edimetia3d
linux 都是开发服务器 什么意思? |
9
edimetia3d 2023-08-23 21:13:54 +08:00
@zzzkkk 就是直接用一个很强的服务器做开发机, 几十个人共用.
|
10
pengtdyd 2023-08-23 21:23:21 +08:00
重构,用新技术
|
11
jmc891205 2023-08-23 22:06:05 +08:00
我们都是分布式编译
提交到集群上编译 |
12
allAboutDbmss 2023-08-23 22:12:19 +08:00
借楼问一下: rust 有这些 cmake 的问题吗?
|
13
richangfan 2023-08-23 22:35:30 +08:00
上双路 EPYC
|
14
cnbatch 2023-08-23 22:51:16 +08:00
@allAboutDbmss 编译速度关 cmake 什么事?
|
15
ivvei 2023-08-23 23:02:59 +08:00
慢一般就慢在模板上……
|
16
yaott2020 2023-08-23 23:32:43 +08:00 via Android
正在等 rust 编译顺便来刷刷 v 站
|
17
yaott2020 2023-08-23 23:33:03 +08:00 via Android
小项目,等 debug 启动中。。。
|
18
lance6716 2023-08-23 23:36:08 +08:00 via Android
打开 v 站搜索“我为什么放弃 go”,看看编译速度快是一件多么微不足道的小事来平衡一下
|
19
learningman 2023-08-24 01:55:37 +08:00 via Android
@allAboutDbmss rust 有神奇的 build.rs
|
20
dangyuluo 2023-08-24 04:01:16 +08:00
IWYU 去掉重复投文件,然后就是模版不要太多层。有人说 forward declaration ,但是我觉得加快的速度无法冲抵带来的麻烦。
|
21
ghostheaven 2023-08-24 04:11:39 +08:00
如果是 link 的时间长只能考虑增加内存和主频,其他的考虑 io 性能,搞个停产的傲腾说不定会快不少
|
22
Soo0 2023-08-24 04:15:13 +08:00 via iPhone
大力出奇迹?
|
23
Weixiao0725 2023-08-24 04:52:32 +08:00 1
make -j 8
|
24
xipuxiaoyehua 2023-08-24 08:34:27 +08:00 via iPhone
cmake 增量编译吧,每次从头开始编译是这样的
|
25
VDarker 2023-08-24 09:00:19 +08:00
incredibuild 效果很不错 就是付费
免费可以自己研究下 fast build 这个项目 开源的 |
26
cslive 2023-08-24 09:17:40 +08:00
大力出奇迹,加配置
|
27
kingzeus 2023-08-24 09:47:59 +08:00
水平扩容,并行编译
|
28
iamqk 2023-08-24 10:49:51 +08:00
预处理经常改的话就要移出来做普通文件
编译环境要用 ramdisk 提升 io 性能 |
29
lsongzhi 2023-08-24 10:55:06 +08:00
sccache + mold
|
30
bfdh 2023-08-24 10:58:26 +08:00
歪个楼,换台性能高的编译服务器。
|
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 照样会吃亏。 |
32
DoWnH 2023-08-24 15:49:10 +08:00
Golang 的初衷之一就是解决 cpp 编译过慢的问题
|
33
encro 2023-08-24 17:00:46 +08:00
为啥没有人提架构上的那一套。Ninja 之类的?
还有就是模块化,没改动的就不编译? 已经 30 分钟,肯定是以上两种方法,以及多线程等方法能明显提效啊。 我是 C++入门选手,如果不对请告诉我。 |
34
gejigeji 2023-08-24 20:06:58 +08:00
make -j 128
|
36
Thymolblue 2023-08-24 21:01:21 +08:00 via Android
歪个楼,目前的项目里引用了 Eigen3 ,编译时间直接增加了 5 分钟。看了一下 cpu 的消耗,只有一个核跑满了,其他核占用基本是 0 ,但是实际是配置了多核编译的。这种如何加速编译呢?
|
37
touchmii 2023-08-24 21:10:21 +08:00 via Android
先用 ninja 试一下能否提高编译速度,效果不明显就分析下源文件和模板文件的数量,判断编译时间主要消耗在哪里,如果 CPU 核心数加不了试一下 xmake 支持多分布式编译,把任务发送到多台主机编译,最后代码架构的前后关联性可能会影响多线程编译,这种情况就别折腾了,买个咖啡机比较合适。
|
38
8675bc86 2023-08-24 21:14:12 +08:00
啥项目编译一次 30 分钟,都没人想着加速??
这团队有点烂。 |
39
thiiadoewjwe OP @8675bc86 国企,都瞎开发,还用的是 MFC
|
40
lixile 2023-08-25 13:50:31 +08:00
建议 回复代码量级 和目前的编译机器配置
上面已经说了很多了 我说个更原始的 如果 30 分钟内 机器并非满载 甚至负载不高 那就是编译脚本 makefile 或者 cmake 没有写好编译依赖导致的 其次是 第三方库全部拆出去预编译 不要重复编译 剩下的就是加配置 加 cache 之类的操作了 整套下来 需要相对系统的处理 |
41
lixile 2023-08-25 13:52:16 +08:00
@Thymolblue 盲猜 传递的给 eigen3 的编译命令 是 make
而不是 make -j8 -j16 之类的 也不是正统学院 or 工程派的 $(MAKE) 其实看看 jobserver 有没有提示报错 或者 warn 基本上就能有结论 |
42
8675bc86 2023-08-25 14:45:23 +08:00
@thiiadoewjwe MFC 赢了,还不提桶跑路,MFC 编译加速不好搞。
|
43
chji5471 2023-08-25 17:35:51 +08:00
我们项目是自动生成几个 cpp 文件,然后 cpp 文件包含具体实现的 cpp 文件,感觉能加快不少
|