【问题标题】:Speed up compilation/link time when using boost libraries使用 boost 库时加快编译/链接时间
【发布时间】:2011-06-29 04:37:12
【问题描述】:

我正在使用Boost Program Options,用它编译非常小的 C++ 代码需要相当长的时间(10 秒甚至更长时间)。在没有 boost 库的情况下编译代码需要 1 秒。

知道如何使用 boost 库来提高编译/链接时间吗?它是跨平台的,所以我需要用 Mac OS X/Linux/PC 编译代码。

【问题讨论】:

  • boost 的某些部分非常有用。尽管许多组件在我看来过度设计并且得到了可怕的头文件依赖,只是因为它们仅在头文件中实现。因此,您最终会一遍又一遍地不必要地重新编译 boost 代码,而静态或共享库会做得很好。
  • 几乎所有足够现代的编译器都支持编译 Boost 的预编译头文件。这些在概念上等同于纯头文件库的静态库。

标签: c++ boost compiler-construction precompiled-headers


【解决方案1】:

除了通常的技巧之外,您无能为力:

  • 最小化依赖关系:只引入你真正需要的 Boost 头文件,并尽可能使用特定的头文件(许多库都有一个“主”头文件,例如 boost/thread.hpp,但也有一个带有特定头文件的子目录,例如 @ 987654323@),
  • 在可能的情况下,依赖前向声明而不是包含整个标题,
  • 如果可能,仅在.cpp 文件中包含标头。如果将其包含在标头中,则必须在每次编译包含该标头的翻译单元时对其进行编译。作为一般经验法则,尽量减少标题中的代码量,
  • 所有主要编译器都支持预编译头文件。使用这些来减少编译时间,
  • unity builds 进行实验。在您的情况下,这可能是也可能不是优势。

最后但同样重要的是,最后一个选项就是不使用那些特定的 Boost 库。

出于方便,我有时会在早期使用某些 Boost 库,并且如果/当编译时间过长时,我会开始查看哪些库编译起来成本很高,哪些库可以用相对简单的代码替换。通常,Boost 会受到如此通用的要求的阻碍。如果您不需要在 8 年前的编译器上工作的东西,或者不需要在这么多不同类型上工作的东西,那么您可以编写一个适合您的简单替代品,并且几乎不需要时间编译。

【讨论】:

  • 你的意思是编译时间比重新实现几乎总是非常好的 Boost 库更有价值吗?购买好的CPU和SSD磁盘怎么样?此外,您对使用预编译头文件的建议平均将此问题减少了约 80%。我认为它几乎是您列出的最后一个,因为并非所有编译器都支持它,只有所有流行的编译器都支持它。如果您的程序需要比“arg1 arg2”更复杂的输入,则通常使用Boost Program Options。在这种情况下,重新实现将是非常耗时的选择。
  • @Andy:不,我说这是一个选项,您可能会在一些情况下考虑。
【解决方案2】:

我在使用 compiler firewall idiom 以减少编译时间方面取得了很好的成功。

【讨论】:

  • AKA Pimpl 成语。当实现确实具有奇怪/不寻常/昂贵的依赖项(例如您不需要/不想在类的 API 中公开的第三方库)时,Pimpl 非常好。但请记住,它确实会产生成本,包括 Pimpl 实例的另一个(通常是动态分配的)类实例以及代码的复杂性,因为该类的大多数 API 将以某种方式转发给 Pimpl 类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
  • 2018-08-20
  • 2016-02-02
  • 1970-01-01
  • 2016-02-27
  • 2017-12-17
相关资源
最近更新 更多