【问题标题】:How to reduce compilation times with Boost Asio如何使用 Boost Asio 减少编译时间
【发布时间】:2011-01-16 13:39:00
【问题描述】:

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

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

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

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

我使用例如:io_servicetcp::ip::socketstcp::ip::acceptordeadline_timer、缓冲区 以及像async_readasync_write这样的少数函数。

有什么建议吗?

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

【问题讨论】:

    标签: c++ boost-asio compilation-time


    【解决方案1】:

    什么平台?在 Linux 上,ccachedistcc 都很棒,包含在大多数发行版中,并且可以快速设置,无论是单独的还是组合的。

    【讨论】:

    • 跨平台,适用于任何编译器。我也想要纯 C++ 解决方案。
    • 那么,是什么让您认为 Boost 开发人员在桌面上留下了加速增益?
    【解决方案2】:
    • 您是否使用boost::lambdaboost::bind 来构建您的完成处理程序? boost::bind 不那么复杂 => 编译速度更快。
    • 您可以使用#pragma message() 分析编译器,以查看是#include-ing 还是实际编译需要时间。我将它与 MSVS 一起使用,发现有时,大部分编译时间都在 .cpp 中的任何代码之前,而其他时候,大部分时间都在之后。这可以帮助您分析编译器的性能。 (但是,如果预处理器/#include 速度很快并且在其他任何东西之前运行,它不会给你太多)

    【讨论】:

    • 我使用 boost::bind 而不是 boost::lambda
    【解决方案3】:

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

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

    有一些方法可以制作预编译的标头,这样它们就不会潜入每个文件并 Windows 化您的代码。

    【讨论】:

      【解决方案4】:

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

      预编译的头文件不会神奇地缩短编译时间。它们通过缓存第一个标头评估来改进 cross-translation-unit 编译时间。因此,除非您在多个源文件中使用#includeing ASIO,否则您不会看到任何好处。任何新的模板实例化都会进一步使最后一个好处变得不那么明显。

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

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

      【讨论】:

        猜你喜欢
        • 2014-06-06
        • 1970-01-01
        • 2022-08-17
        • 1970-01-01
        • 1970-01-01
        • 2021-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多