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

5
Boost.Asio是一个很棒的库,但有一个巨大的缺点——编译时间非常慢。在GCC 4.4下,一个简单的HTTP协议实现(真的很简单,只有约1k行代码)需要约13.5秒才能编译完成!
我尝试使用PCH,但对提高编译速度帮助不大(只有约1秒)。
那么,是否有任何关于如何加快Boost.Asio编译速度的教程?
例如,应该为什么类包含哪些头文件。
我使用了一些类似io_servicetcp::ip::socketstcp::ip::acceptordeadline_timer,buffers以及一些函数,如async_readasync_write
有什么建议吗?
另外,我在可以使用时会使用pimpl。
4个回答

5

什么平台?在Linux上,ccachedistcc都非常棒,它们被包含在大多数发行版中,并且很容易设置,可以单独使用或者组合使用。


跨平台,适用于任何编译器。同时我想要一个纯C++的解决方案。 - Artyom
4
Boost开发人员留下了哪些加速增益,是什么让你认为如此? - Dirk Eddelbuettel

4
  • 您是否使用boost::lambdaboost::bind来构建完成处理程序? boost::bind更简单,编译速度更快。
  • 您可以使用#pragma message()对编译器进行分析,以查看是#include还是实际编译需要时间。我曾在MSVS中使用过这个功能,发现有时大部分编译时间都在.cpp文件中的任何代码之前,而其他时候则主要在之后。这可以帮助您分析编译器的性能。(但是,如果预处理器/#include很快,并且在任何其他操作之前运行,它将不会提供太多帮助)

我使用boost::bind而不是boost::lambda - Artyom

3

嗯,您可能早就解决了这个问题。但以防万一。

预编译头并不能神奇地提高编译时间。它们通过缓存第一个头文件的评估来提高跨翻译单元的编译时间。因此,除非您在多个源文件中使用#include ASIO,否则您将看不到任何好处。任何新的模板实例化都会进一步减少这种最后的好处。

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

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


3
我们正在使用boost thread、asio以及一些其他库,包括Qt。谨慎地使用预编译头文件可以使构建时间提高10倍。我们参考了以下内容来进行指导:http://www.cygnus-software.com/papers/precompiledheaders.html。有一些方法可以使用预编译头文件,以便它们不会渗入到每个文件中并使您的代码与Windows相关联。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接