如何使用Boost Asio减少编译时间

时间:2010-02-13 20:40:47

标签: c++ boost-asio compilation-time

Boost.Asio是一个很棒的库,但它有一个巨大的缺点 - 编译时间极慢。 HTTP协议的简单实现(非常简单)(约1k行代码)需要在GCC 4.4下编译大约13.5秒!

我尝试使用PCH,但它不会过多地改善编译时间(仅限1秒左右)。

那么有没有关于如何使Boost.Asio编译时间更快的教程?

例如,我应该为哪个类准确包含哪些标题。

我使用的例如:io_servicetcp::ip::socketstcp::ip::acceptordeadline_timer,缓冲区 很少有像async_readasync_write这样的功能。

有什么建议吗?

P.S。:我尽可能使用pimpl。

4 个答案:

答案 0 :(得分:4)

什么平台?在Linux上,ccachedistcc都很棒,包含在大多数发行版中,并且可以单独或甚至组合设置。

答案 1 :(得分:4)

  • 您是否使用boost::lambdaboost::bind来构建完成处理程序? boost::bind不太复杂=>编译得更快。
  • 您可以使用#pragma message()来分析编译器,看它是#include还是需要时间的实际编译。我已经在MSVS上使用它来看到有时,大多数编译时间都在.cpp中的任何代码之前,有时候,它主要是在之后。这可以帮助您分析编译器的性能。 (但是,如果预处理器/ #include是快速的并且在其他任何东西之前运行,它将不会给你太多的东西)

答案 2 :(得分:1)

嗯,你很久以前就解决了这个问题。但为了以防万一。

预编译头文件不会神奇地改善编译时间。它们通过缓存第一个头评估来改进交叉翻译单元编译时间。因此,除非您跨多个源文件#include使用ASIO,否则您将看不到任何好处。任何新的模板实例化都将进一步使最后的好处更加明显。

我建议将ASIO隔离到单个源文件。不要在任何“非详细信息”头文件中包含ASIO。如果必须执行后者,请尝试使用Pimpl模式隐藏它。

如果您发现自己需要在多个源文件中使用ASIO功能,那么请考虑在代码和ASIO之间构建抽象层。如果你保持尽可能简单,确保桥接代码永远不会改变,那么你甚至可以在PCH中#include这个界面。

答案 3 :(得分:1)

我们正在使用boost thread,asio和一些其他库,包括Qt。使用预编译的头文件可以使构建时间缩短10:1。我们提到了以下指导:

http://www.cygnus-software.com/papers/precompiledheaders.html

有一些方法可以进行预先推荐的标题,这样它们就不会渗透到每个文件中并使用Windows代码。