GCC编译时不会从预编译头多受益(GCC build time doesn't benefi

2019-08-02 12:59发布

我有一个巨大的工程,东西长约150 000 LOC的C ++代码。 建造时间是东西约15分钟。 该工程由不同大小的许多子项目。

我已经建立了单独的预编译头的每个子项目,但是当我使用他们建立时间保持大致相同。 看起来,建立时间小于5-10%的百分比,而不是更多。

预编译的头肯定是用,我用-Winvalid-pch选项,我试图与编译-H编译器选项,我的预编译头出现在“砰”的符号输出,这意味着编译器能够使用预编译头。

我所有的预编译的头不是很大,每一个文件是一些关于50MB的。 我使用python脚本,发现这里产生最常用的预编译头的列表,以便我的预编译的候选人名单是相当不错的。

是否有建立优化的任何自由/开源工具? 这似乎是标准的make工具不具备衡量不同的指标构建时间的能力。 我找不到让具有不同目标的统计信息的方式make 。 我不是在谈论依赖性分析什么先进。 我只是想知道什么目标大部分时间被浪费了。

此外,它似乎是海湾合作委员会是在处理预编译头非常低效的。 我无法得到任何子项目建设明显加快,最大加速,我得到的是20%,这是获得三分钟打造一个项目。 它似乎更容易和更便宜的购买更快的机器用固态硬盘,而不是用GCC在Linux上优化编译时间。

Answer 1:

如果你想充分利用这个功能,你需要了解你的项目如何被构建好好利用它们。 最好的办法是手工打造减少时间缓慢,艰难的过程。 听起来起初很愚蠢,但如果所有构建向前发展是快5倍,你知道如何构建你的项目和依存关系向前发展 - 那么你就实现了盈利。

你可以设置你的目标,持续集成系统,以测量和记录你的进步/改进的更改进来了。

我有一个巨大的工程,东西长约150 000 LOC的C ++代码。 建造时间是东西约15分钟。 该工程由不同大小的许多子项目。

听起来像它做了很多多余的工作,假设你有一个现代化的机器。

也可以考虑链接倍。

我所有的预编译的头不是很大,每一个文件是一些关于50MB的。

这是相当大的,海事组织。

我不是在谈论依赖性分析什么先进。

此外,统计资料的持续集成。 对于构建慢,过度依赖是非常有可能的问题(除非你有很多很多小cpp文件,或一些愚蠢的类似的物理内存耗尽发生)。

我无法得到任何子项目建设特别快,我得到最大的加速比为20%

了解您的结构和依赖。 PCHS放慢了我的大部分项目。

它似乎更容易和更便宜的购买更快的机器用固态硬盘,而不是用GCC在Linux上优化编译时间。

机会是,这台机器不会让你的编译时间快20倍,而且修复了你的依赖和项目结构可以让它快20倍 (或任何问题的根源,最终是)。 该机可帮助只有这么多(考虑制作时间150KSLOC)。

您的作品可能是CPU /内存约束。



Answer 2:

GCC编译时不会从预编译头多受益

是的,不幸的是往往是真的,

有一些实验项目做的更好的东西,看到http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3426.html和http://gcc.gnu.org/wiki / PPH ,但他们不能使用呢。

我同意对方的回答是15分钟150KLOC是相当缓慢。

我发现,使用金连接器,使一个巨大的差异,以构建时间,我强烈推荐它。

你也可以考虑的ccache ,它可以帮助,如果您有其他机器上的空闲周期的distcc

避免建立在缓慢的磁盘,当然避免网络磁盘。 避免递归调用make,它花更多的时间阅读的makefile并重新创建的依赖关系图。 如果你可以组织你的子项目的makefile这样他们就能通过一个单一的顶层Makefile包括,非递归作将需要更长的时间来上手,但一旦开始建设目标将飞。 这可以是一个大量的工作,虽然改写makefile文件。

它可能不言而喻,但建立一个多核机器上使用make -j N其中一个很好的经验法则是, N应该是两次核的次数越多,或者如果编译I / O瓶颈。



Answer 3:

产生和使用的PCH,以包括包含大量报头的文件时,我使用-include。 它可以帮助,但它仍然不是令人印象深刻。

想想你的幸福,但:GCC似乎比说,MSVC快好几倍,即使MSVC具有更好的PCH支持。



文章来源: GCC build time doesn't benefit much from precompiled headers