繁体   English   中英

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

[英]Why are multiple files much faster to compile than the combined file?

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

我采用了最慢的文件进行编译。 该文件耗时352秒来编译。 它由10个测试用例组成。 为了测试和发现编译时瓶颈,我将其分成10个文件 (每个文件1个测试用例),每个文件的编译时间总和(不是并行!)为215秒。 快了40% 我没想到这一点。 通常,如果将文件放在一起,则可以节省编译时间,因为某些标头仅包含一次,并且编译器可以利用模板备注来避免某些实例化,但是我不明白为什么拆分文件会花很多时间有所不同。

是什么原因造成这种巨大差异?

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

PS它占用的最大内存也要少得多,但这是预期的。

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

之所以需要更长的时间,是因为在编译过程中需要处理的所有数据的大小都会增加。 将有一个(稍大)的符号表,将有一个较大的解析树。

如果您遇到所有数据都无法放入内存的情况,则可能会遇到交换问题。

我终于找到了解决问题的方法,但是我不太了解。

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

可以在Github上找到该提交。

我真的看不到std :: async的使用如何改变编译时间。 我看过代码,但看不到任何会造成如此大破坏的东西。

如果有人有线索,我会很高兴听到。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM