【发布时间】:2015-10-22 09:18:58
【问题描述】:
我们正在开发一个C++ library,目前包含超过 50000 个单独的 .cpp 文件。这些都被编译并归档到一个静态库中。即使使用并行构建,这也需要几分钟。我想减少这个编译时间。
每个文件平均有 110 行,其中包含一个或两个函数。但是,对于每个 .cpp 文件,都有一个对应的 .h 标头,并且这些标头通常包含在许多 .cpp 文件中。例如,A.h 可能包含在 A.cpp、B.cpp、C.cpp 等中。
我想先介绍编译过程。有没有办法找出在做什么上花费了多少时间?我担心打开头文件只是为了检查包含保护并忽略文件而浪费了很多时间。
如果这类事情是罪魁祸首,那么减少编译时间的最佳做法是什么?
我愿意添加新的分组标题,但可能不愿意更改这种多文件布局,因为这使我们的库也可以作为按需仅标题库。
【问题讨论】:
-
我不确定打开文件是否真的需要时间。通常,可以通过包含较少无用的重头文件(包含许多内联函数/模板元编程结构)和减少头文件之间的耦合来减少编译时间。但是,如果您的标头仅包含前向声明,那么可能只是 500x100x110 行代码(根据您的数字)。毕竟 C++ 编译速度很慢,只要确保每次重新编译都不会重新编译不依赖于更新文件的东西。好吧,我猜你什么时候会看到它。
-
您可能会发现tup 构建系统很有趣,它非常快并且避免了冗余。一些测试:gittup.org/tup/make_vs_tup.html
-
您是每次都进行完全重建,还是只重建需要重建的文件?您能否以这样一种方式重新组织代码,以减少为响应大多数代码更改而重新构建的文件?
-
@JeremyFriesner,在开发时使用 cmake,所以我只重建必须的。在进行全新构建时,例如在进行夜间编译检查时,我会更加恼火。
标签: c++ include-guards pre-compilation compilation-time dependency-graph