如何加快g ++编译时间(使用大量模板时)

Dan*_*vil 63 c++ templates compilation g++

这个问题可能有些奇怪,但我怎样才能加快g ++编译时间?我的C++代码大量使用boost和模板.我已经尽可能多地从头文件中移动并使用-j选项,但是编译(和链接)仍需要很长时间.

是否有任何工具可以分析我的代码并指出编译器的瓶颈?或者可以以某种方式分析在我的代码上运行的编译器?这将是非常好的,因为有时我有这样的印象,我花了太多时间盯着编译器控制台日志...

str*_*ger 49

对我来说最有用的是:

  • 构建在RAM文件系统上.这在Linux上是微不足道的.您可能还希望在RAM文件系统上保留公共头文件(预编译或实际.h文件)的副本.
  • 预编译的头文件.我有一个(主要)库(例如Boost,Qt,stdlib).
  • 尽可能声明而不是包含类.这样可以减少依赖关系,从而减少更改头文件时需要重新编译的文件数.
  • 并行化make.这通常有助于逐个案例,但我在-j3全球范围内制作.但是,确保您的Makefile中的依赖关系图是正确的,否则您可能会遇到问题.
  • 使用-O0,如果你不测试执行速度或代码大小(和你的电脑足够快你不那么在意(可能小)的性能损失).
  • 每次保存时编译.有些人不喜欢这样,但是它允许你提前看到错误并且可以在后台完成,减少了你在完成编写并准备测试时必须等待的时间.

  • -O0值得注意! (2认同)
  • 我怀疑在 RAM 文件系统中构建会改善任何事情。如果您有足够的 RAM,Linux 内核只会缓存写入和读取,因此从/向文件读取/写入应该已经使用 RAM。 (2认同)

Sam*_*ler 17

这是我在你描述的非常类似的场景下加速构建所做的工作(boost,templates,gcc)

  • 构建在本地磁盘上而不是像NFS这样的网络文件系统
  • 升级到更新版本的gcc
  • 调查distcc
  • 更快的构建系统,尤其是更多的RAM

  • 当你使用DVCS或团队时,`ccache`会有很大的帮助,因为在这两种情况下,即使文件来自另一个位置,也可能已经编译了文件. (5认同)
  • icecream/icecc比distcc更好:"与distcc不同,Icecream使用一个中央服务器来动态地将编译作业调度到最快的免费服务器." (4认同)

Nor*_*ame 17

我认为我们正在谈论分钟编译文件,即预编译头或本地磁盘的问题都不是问题.

使用深层模板代码(boost等)的长编译时间通常源于gcc在模板实例化时不友好的渐近行为,特别是当使用模板默认参数模拟可变参数模板时.

这是一个文档,它将减少的编译时间命名为可变参数模板的动机:

cpptruths有一篇关于gcc-4.5如何更好地代表它以及它如何通过其可变参数模板做得非常出色的文章:

IIRC然后BOOST有办法限制伪变量的模板默认参数的生成,我认为'g ++ -DBOOST_MPL_LIMIT_LIST_SIZE = 10'应该工作(默认为20)

更新:还有一个很好的线程,通过一般技术来加速在SO上进行编译,这可能很有用:

更新:这个是关于编译模板时的性能问题,接受的答案也推荐gcc-4.5,也提到了clang作为一个积极的例子:

  • 另请参阅http://gcc.gnu.org/gcc-4.5/changes.html:`使用模板的代码的编译时间现在应该与实例化的数量呈线性比例,而不是按字母顺序扩展,因为现在使用哈希查找模板实例化tables.` (3认同)

vir*_*tor 10

如果你正在进行大量的重新编译,ccache可能会有所帮助.它实际上并没有加快编译速度,但如果您因某些原因碰巧进行了无用的重新编译,它将为您提供缓存结果.它可能会给人一种解决错误问题的印象,但有时重建规则非常复杂,以至于在新构建期间实际上最终会使用相同的编译步骤.

另外的想法:如果您的代码使用clang编译,请使用它.它通常比gcc快.