3

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。

4

4 回答 4

4
  • 你是使用boost::lambda还是boost::bind构建你的完成处理程序? boost::bind不太复杂 => 编译速度更快。
  • 您可以使用#pragma message() 分析编译器,以查看是#include-ing 还是实际编译需要时间。我将它与 MSVS 一起使用,发现有时大部分编译时间都在 .cpp 中的任何代码之前,而其他时候,大部分时间都在之后。这可以帮助您分析编译器的性能。(但是,如果预处理器/#include 很快并且在其他任何东西之前运行,它不会给你太多)
于 2010-02-13T22:03:39.523 回答
4

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

于 2010-02-13T20:44:42.397 回答
2

我们正在使用 boost thread、asio 和其他一些库,包括 Qt。仔细使用预编译的头文件在构建时间上取得了 10:1 的改进。我们参考了以下指导:

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

有一些方法可以做预编译的头文件,这样它们就不会潜入每个文件和 Windows 化你的代码。

于 2011-09-20T15:06:40.607 回答
2

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

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

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

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

于 2010-06-10T01:13:37.123 回答