说一个反直觉的事情,一个巨无霸 CPP 源文件的编译速度,要快于实现相同功能的一堆小文件。

2023-02-14 14:11:37 +08:00
 tool2d
理由是 C++是按照 CPP 文件单独编译的。一堆小 CPP 文件,头文件会很重复包含多次,编译器每次都会解析一遍,就会很慢。

但是把所有函数硬塞进一个巨无霸 CPP 文件,显然也是很不合理的。

那么问题来了,有没有办法即兼顾编译速度,又能合理按照小功能划分源文件?
4895 次点击
所在节点    C++
33 条回复
kidonng
2023-02-14 15:40:36 +08:00
一看到标题就想到 sqlite https://opensource.apple.com/source/CPANInternal/CPANInternal-108/DBD-SQLite/sqlite3.c.auto.html

** This file is an amalgamation of many separate C source files from SQLite
** version 3.6.22. By combining all the individual C code files into this
** single large file, the entire code can be compiled as a one translation
** unit. This allows many compilers to do optimizations that would not be
** possible if the files were compiled separately. Performance improvements
** of 5% are more are commonly seen when SQLite is compiled as a single
** translation unit.

虽然说的是运行速度不是编译速度🐶
tyrantZhao
2023-02-14 15:42:06 +08:00
可读性大于编译速度,都用 cpp 了,就别考虑编译速度了。
kemchenj
2023-02-14 16:08:02 +08:00
前面的人说了很多了,其实主要就是并发编译多个文件,头文件重复解析导致的,而且还得竞争写入编译缓存,结果就是所有线程都在互等。

LLVM 大会还有一个 Session 专门讲这件事情 <amp-youtube data-videoid="Ptr6e4CVTd4" layout="responsive" width="480" height="270"></amp-youtube> ,感兴趣的话可以看一下。
debuggerx
2023-02-14 16:20:41 +08:00
nullyouraise
2023-02-14 17:52:31 +08:00
很多大型项目的构建系统都有这种机制,Unity 、Unreal 等,build 之前会按照一定规则将源文件通过 include 来放入一个更大的 cpp 中一次性编译
Chromium 曾经也有这种机制叫 Jumbo Build ,但开发团队认为由此获取的编译速度提升与带来的各种编译错误问题相比收益太小,在 2018 年左右时取消了,导致当时我编译耗时翻了四倍
antonius
2023-02-14 18:06:00 +08:00
上面都说了可读性>编译速度,提高编译速度可以试试 ninja + buildcache + icecream
tool2d
2023-02-14 18:11:29 +08:00
@antonius 倒不是说写新代码都要一个主文件,而是我最近看的几个古老 CPP 项目代码,很多都是一个文件有 1 万行。

我就在思考,IDE 有没有很科学的办法,去管理一个巨大代码文件。并让人舒服在里面写代码,和按照功能跳来跳去。
GordianZ
2023-02-14 18:20:24 +08:00
@tool2d 我二十多万行的 CPP 文件 VS 打开补全啊啥的完全不能用。只要一按 F12 跳转 IntelliSense 就崩溃,全是红波浪。我都是单独开别的编辑器搜索函数名来用……
icylogic
2023-02-14 18:32:48 +08:00
可以参考 cotire ,主要干的事就是
- precompiled header 预编译头,但是只能解决一部分
- single compilation unit ( cmake 的 unity build )把 cpp 整合成一个巨大的编译单元

c 艹 加速编译还有一大堆可以做的事,比如 ccache ,distcc ,pimpl …
kkocdko
2023-02-15 00:33:37 +08:00
是的

jumbo_build
litguy
2023-02-15 08:18:03 +08:00
@GordianZ 50W 行 C++ 路过,绝大部分是 .hpp 的模板类,编译起来有点慢( x86 还行,国产 ARM 即使 make -j64 也及其慢),但是 vs code 打开还是很顺利,平常都是 ssh remote 方式开发,符号跳转有时候不怎么好用,从来没用过补全功能,单纯打字写代码,感觉还很流畅
tool2d
2023-02-15 09:31:58 +08:00
@litguy 没考虑过把 50W 行拆成 10 个小文件,用一个 CPP include 这 10 个小文件吗?

编辑器表示你们这么玩,我压力很大。

这种真巨无霸,一部分代码都是程序生成的吧。
LGA1150
2023-02-23 20:16:19 +08:00
@kidonng 这个可以用 LTO 解决

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/916003

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX