2010-02-13 65 views
3

Boost.Asio是一个伟大的库,但它有一个巨大的缺点 - 编译时间太慢。一个简单的HTTP协议实现(大约1k行代码)需要大约13.5s在GCC 4.4下编译!如何使用Boost Asio减少编译时间

我尝试使用PCH,但它不会提高编译时间(仅限于大约1秒)。

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

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

我使用例如:io_servicetcp::ip::socketstcp::ip::acceptordeadline_timer,缓冲 和像async_readasync_write一些功能。

有什么建议吗?

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

回答

4

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

+0

跨平台,适用于任何编译器。另外我想要纯粹的C++解决方案。 – Artyom 2010-02-13 21:07:06

+3

那么,是什么让你觉得Boost开发者在桌面上留下了一个加速增益? – 2010-02-13 21:38:44

4
  • 您是否使用boost::lambdaboost::bind构造完成处理程序? boost::bind不那么复杂=>编译速度更快。
  • 您可以使用#pragma message()来分析编译器,看看它是否包含#include或需要时间的实际编译。我已经使用MSVS的这种看法,有时候,大部分编译时间都在.cpp中的任何代码之前,而其他时间大部分时间在这之后。这可以帮助您分析编译器的性能。 (但是,如果预处理程序/#include很快并且在其他任何地方运行,它不会给你太多)
+0

我使用'boost :: bind'而不是'boost :: lambda' – Artyom 2010-02-14 05:27:39

1

那么,你可能很久以前就已经解决了。但为了以防万一。

预编译头文件不会奇迹般地提高编译时间。他们通过缓存第一个头部评估来改进编译时间交叉翻译单元。因此,除非您在多个源文件中使用ASIO,否则您不会看到任何好处。任何新的模板实例化将进一步使这最后的好处更不明显。

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

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

1

我们使用boost线程,asio和一些其他库,包括Qt。仔细使用预编译头文件可以缩短构建时间10:1。我们简称为指导以下几点:

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

有办法做precomiled头,因而不会蔓延到每一个文件和Windowsify你的代码。

相关问题