【发布时间】:2020-08-04 14:13:03
【问题描述】:
对于我的测试,我需要编译几千个 C++ 文件,这些文件有很多共同的代码。因为并非所有编译器都符合(或更宽松),所以我在 windows 和 linux 上使用 g++、clang++ 和 msvc 执行所有测试。
为了缩短编译时间,我将已经预编译的头文件用于公共代码。此外,我编写了一个小型预处理器应用程序以允许“统一构建”(将 *.cpp 文件合并到单个 *.cpp 文件中)。
目前我得到以下编译时间(随机测试用例):
- 带 PCH 的 MSVC:0.573 秒
- 没有 PCH 的 MSVC:5.367 秒
(大约 10 次)
- Clang 与 PCH:5.221 秒
- 没有 PCH 的 Clang:7.225 秒
(大约 1.4 倍)
- 带有 PCH 的 G++:3.099 秒
- 没有 PCH 的 G++:5.826 秒
(大约 1.9 倍)
不幸的是,我的代码包含很多模板/模板实例化,它们似乎只“保存”在 Microsoft PCH 中。
你知道有什么方法可以让 g++ 和 clang++ 的编译时间相似吗?你有什么建议可以改善我的编译时间吗?
【问题讨论】:
-
统一构建对此有何影响?另一种通用技术是并行构建。最简单的是单独文件的“令人尴尬的并行性”。这与统一构建存在一定的张力,但是如果您将统一构建批处理成多个块而不是全部在一个文件中,那么这两种技术可以一起工作。您可以通过 IncrediBuild 或 icecc 使用其他机器进一步扩展此功能。
-
使用“统一构建”,您不必在每个翻译单元中实例化模板。由于我所有的测试用例,我的 CPU 负载已经达到 100%。
-
PS,您正在考虑将 MSVC 作为您的基准,但您可以使用 vcperf 进行相同类型的构建分析。 See here.
-
对。我了解统一构建的好处。你是说你上面的数字反映了统一构建的使用吗?你用了多少个统一块?您在构建期间使用了多少个处理器?您是否有其他可用机器可以进一步并行化构建?
-
你的统一构建了多少块?您的机器的全部 CPU 容量是专门用于构建,还是在构建时同时运行测试? (如果在构建时进行测试,您可能想找到一种方法来管道这些操作。)到目前为止,我们只讨论了提高构建性能的外部来源。有人可能仍然会谈到可能会产生一些影响的特定于编译器的构建标志。我不是那里的专家,所以我会听从别人的意见。
标签: c++ g++ llvm clang++ compile-time