2010-02-13 67 views
3

Boost.Asio是一個偉大的庫,但它有一個巨大的缺點 - 編譯時間太慢。一個簡單的HTTP協議實現(大約1k行代碼)需要大約13.5s在GCC 4.4下編譯!如何使用Boost Asio減少編譯時間

我嘗試使用PCH,但它不會提高編譯時間(僅限於大約1秒)。

那麼有沒有關於如何使Boost.Asio編譯時間更快的教程?

例如,我應該爲什麼類準確包含哪些標題。

我使用例如:io_servicetcp::ip::socketstcp::ip::acceptordeadline_timer,緩衝 和像async_readasync_write一些功能。

有什麼建議嗎?

P.S .:我儘可能使用pimpl。

回答

4

什麼平臺?在Linux上,ccachedistcc都很棒,包含在大多數發行版中,並且可以單獨設置,甚至可以組合使用。

+0

跨平臺,適用於任何編譯器。另外我想要純粹的C++解決方案。 – Artyom 2010-02-13 21:07:06

+3

那麼,是什麼讓你覺得Boost開發者在桌面上留下了一個加速增益? – 2010-02-13 21:38:44

4
  • 您是否使用boost::lambdaboost::bind構造完成處理程序? boost::bind不那麼複雜=>編譯速度更快。
  • 您可以使用#pragma message()來分析編譯器,看看它是否包含#include或需要時間的實際編譯。我已經使用MSVS的這種看法,有時候,大部分編譯時間都在.cpp中的任何代碼之前,而其他時間大部分時間在這之後。這可以幫助您分析編譯器的性能。 (但是,如果預處理程序/#include很快並且在其他任何地方運行,它不會給你太多)
+0

我使用'boost :: bind'而不是'boost :: lambda' – Artyom 2010-02-14 05:27:39

1

那麼,你可能很久以前就已經解決了。但爲了以防萬一。

預編譯頭文件不會奇蹟般地提高編譯時間。他們通過緩存第一個頭部評估來改進編譯時間交叉翻譯單元。因此,除非您在多個源文件中使用ASIO,否則您不會看到任何好處。任何新的模板實例化將進一步使這最後的好處更不明顯。

我建議隔離ASIO到單個源文件。不要在任何'非詳細'頭文件中包含ASIO。如果您必須執行後者,請嘗試使用Pimpl模式隱藏它。

如果您發現自己需要多個源文件中的ASIO功能,那麼請考慮在代碼和ASIO之間構建一個抽象層。如果保持儘可能簡單,確保橋接代碼不會改變,那麼您甚至可以在PCH中使用此接口。

1

我們使用boost線程,asio和一些其他庫,包括Qt。仔細使用預編譯頭文件可以縮短構建時間10:1。我們簡稱爲指導以下幾點:

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

有辦法做precomiled頭,因而不會蔓延到每一個文件和Windowsify你的代碼。

相關問題