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

发布于 2024-08-21 05:00:49 字数 450 浏览 2 评论 0原文

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

我尝试使用 PCH,但它并没有太多地改善编译时间(大约仅 1 秒)。

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

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

我使用例如:io_servicetcp::ip::socketstcp::ip::acceptordeadline_timer代码>,缓冲区 以及一些函数,例如async_readasync_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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

烟酉 2024-08-28 05:00:49

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

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.

孤独岁月 2024-08-28 05:00:49
  • 您使用 boost::lambdaboost::bind 来构造完成处理程序吗?
    boost::bind 不太复杂 =>编译速度更快。
  • 您可以使用 #pragma message() 分析编译器,看看是 #include-ing 还是实际编译需要时间。我将其与 MSVS 一起使用,发现有时大部分编译时间都在 .cpp 中的任何代码之前,而其他时候则主要在 .cpp 中的任何代码之后。这可以帮助您分析编译器的性能。 (但是,如果预处理器/#include 速度很快并且在其他任何事情之前运行,它不会给你带来太多)
  • Do you use boost::lambda or boost::bind to construct your completion handlers?
    boost::bind is less complex => compiles faster.
  • You can profile the compiler with #pragma message() to see if it's the #include-ing or the actual compiling that takes time. I've used this with MSVS to see that sometimes, most of the compilation time is before any code in the .cpp, and other times, it's mostly after. That could help you to profile your compiler's performance. (But, if the preprocessor/#include is fast and run before anything else, it won't give you much)
淡看悲欢离合 2024-08-28 05:00:49

好吧,你可能很久以前就解决了这个问题。但以防万一。

预编译头并不会神奇地缩短编译时间。它们通过缓存第一个标头评估来提高跨翻译单元编译时间。因此,除非您在多个源文件中#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 #includeing 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.

风情万种。 2024-08-28 05:00:49

我们正在使用 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文