How to reduce compilation times with Boost Asio

前端 未结 4 439
南旧
南旧 2021-01-14 09:14

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 cod

相关标签:
4条回答
  • 2021-01-14 09:59

    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.

    0 讨论(0)
  • 2021-01-14 10:02

    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.

    0 讨论(0)
  • 2021-01-14 10:14
    • 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)
    0 讨论(0)
  • 2021-01-14 10:21

    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.

    0 讨论(0)
提交回复
热议问题