为什么多个文件的编译速度比组合文件快得多?

时间:2016-01-18 14:50:43

标签: c++ gcc

我目前正在减少使用大量模板的项目的编译时间。它使用表达式模板和大量可变结构进行了大量的模板元编程。

我把最慢的文件编译好了。这个文件需要352秒才能编译。它由10个测试用例组成。为了测试和发现编译时瓶颈,我将其拆分为10个文件(每个文件1个测试用例),每个文件的编译时间总和(不是并行!)为215秒。这大约快40%!我没想到这一点。通常,如果你把文件放在一起,你就可以获得编译时间,因为有些标题只包含一次,编译器可以使用模板memoization来避免一些实例化,但我不知道为什么拆分文件会使差不多。

可能导致这种巨大差异的原因是什么?

我使用的是g ++ - 4.9.3,这是一个调试版本(仅限-g)。

P.S。它还需要更少的最大内存,但这是预期的。

2 个答案:

答案 0 :(得分:1)

这听起来像极速的速度差异。在理想的情况下,这不是应该期待的。

需要更长时间的原因是编译期间需要处理的所有数据都会增大。将有一个(略微)更大的符号表,将有一个更大的解析树。

如果您遇到所有数据都不适合内存的情况,您可能会遇到交换问题。

答案 1 :(得分:1)

我终于找到了解决问题的方法,但我并不完全理解。

它与std :: async和future有关。我使用std :: async并行运行一些计算,传递给它的仿函数有点复杂。一旦我用我自己的线程池替换了std :: async和future的使用,它将monolihtic文件的编译时间从344秒减少到44秒,这几乎是8倍。而且,现在拆分文件的编译速度比单片文件慢了两倍(84秒),这更有意义。

可以找到提交on Github

我真的没有看到如何使用std :: async来改变编译时间。我查看了代码,但我没有看到任何应该造成如此严重破坏的内容。

如果有人有线索,我会非常倾听。