如何使用 Boost Asio 减少编译时间
Boost.Asio 是一个很棒的库,但它有一个巨大的缺点——编译时间极慢。一个简单的HTTP协议实现(真的很简单)(大约1k行代码)在GCC 4.4下编译需要大约13.5s!
我尝试使用 PCH,但它并没有太多地改善编译时间(大约仅 1 秒)。
那么有没有关于如何使 Boost.Asio 编译时间更快的教程?
例如,我应该为哪个类准确包含哪些标头。
我使用例如:io_service
、tcp::ip::sockets
、tcp::ip::acceptor
、deadline_timer
代码>,缓冲区 以及一些函数,例如async_read
、async_write
。
有什么建议吗?
PS:只要有可能,我都会使用 pimpl。
Boost.Asio is great library but it has one huge drawback -- extreamly slow compilation times. A simple implementation (really simple) of HTTP protocol (about 1k lines of code) requires about 13.5s to compile under GCC 4.4!
I tryed to use PCH but it does not improve compilation times too much (about 1s. only).
So are there any tutorials on how to make Boost.Asio compilation times faster?
For example what headers should I exactly include for what class.
I use for example: io_service
, tcp::ip::sockets
, tcp::ip::acceptor
, deadline_timer
, buffers
and few functions like async_read
, async_write
.
Any suggestions?
P.S.: I do use pimpl whenever I can.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
什么平台?在 Linux 上,ccache 和 distcc 非常棒,包含在大多数发行版中,并且可以单独甚至组合地快速设置。
What platform? On Linux, both ccache and distcc are awesome, included in most distributions and a snap to set up, either individually or even combined.
boost::lambda
或boost::bind
来构造完成处理程序吗?boost::bind
不太复杂 =>编译速度更快。boost::lambda
orboost::bind
to construct your completion handlers?boost::bind
is less complex => compiles faster.好吧,你可能很久以前就解决了这个问题。但以防万一。
预编译头并不会神奇地缩短编译时间。它们通过缓存第一个标头评估来提高跨翻译单元编译时间。因此,除非您在多个源文件中
#include
使用 ASIO,否则您不会看到任何好处。任何新的模板实例化都会进一步使最后一个好处变得更加不明显。我建议将 ASIO 隔离到单个源文件。不要在任何“非详细”头文件中包含 ASIO。如果您必须执行后者,请尝试使用 Pimpl 模式来隐藏它。
如果您发现自己在多个源文件中需要 ASIO 功能,那么请考虑在代码和 ASIO 之间构建一个抽象层。如果您保持尽可能简单,确保桥接代码永远不会更改,那么您甚至可以在 PCH 中
#include
此接口。Well, you probably solved this long ago. But just in case.
Precompiled headers do not magically improve compilation times. They improve cross-translation-unit compile times by cacheing the first header evaluation. Thus you won't see a benefit unless you are
#include
ing ASIO across multiple source files. Any new template instantiations will further make this last benefit even less noticeable.I suggest isolating ASIO to a single source file. Don't include ASIO in any 'non-detail' header files. If you must do the latter, try to hide it by using the Pimpl pattern.
If you find yourself requiring ASIO functionality in multiple source files, then think about building an abstraction layer between your code and ASIO. If you keep it as simple as possible, ensuring the bridging code never changes, then you can even
#include
this interface in the PCH.我们正在使用 boost 线程、asio 和其他一些库,包括 Qt。仔细使用预编译头可以将构建时间缩短 10:1。我们参考了以下内容作为指导:
http://www.cygnus-software.com/papers /precompiledheaders.html
有一些方法可以进行预编译标头,这样它们就不会渗透到每个文件中并 Windowsify 您的代码。
We are using boost thread, asio and a few other libs, including Qt. Using precompiled headers carefully made a 10:1 improvement in build time. We referred to the following for guidance:
http://www.cygnus-software.com/papers/precompiledheaders.html
There are ways to do precomiled headers so that they don't creep into every file and Windowsify your code.