簡體   English   中英

GCC 構建時間不會從預編譯頭文件中受益太多

[英]GCC build time doesn't benefit much from precompiled headers

我有一個龐大的項目,大約有 150 000 LOC 的 C++ 代碼。 構建時間大約為 15 分鍾。 該項目由許多不同規模的子項目組成。

我為每個子項目構建了單獨的預編譯頭文件,但是當我使用它們時,構建時間大致保持不變。 似乎構建時間減少了 5-10%,而不是更多。

肯定使用了預編譯頭,我使用-Winvalid-pch選項,並且我嘗試使用-H編譯器選項進行編譯,我的預編譯頭出現在帶有 'bang' 符號的輸出中,這意味着編譯器能夠使用預編譯頭。

我所有的預編譯頭文件都不是很大,每個文件大約 50Mb。 我使用 python 腳本,在這里找到生成最常用的預編譯頭的列表,所以我的預編譯候選列表非常好。

是否有用於構建優化的免費/開源工具? 似乎標准的make實用程序沒有能力測量不同目標的構建時間。 我找不到使用make獲取不同目標統計信息的方法。 我不是在談論依賴分析或高級的東西。 我只想知道大部分時間都浪費在了哪些目標上。

此外,似乎 GCC 在處理預編譯頭方面效率很低。 我無法以更快的速度構建任何子項目,在構建三分鍾的項目中,我獲得的最大加速是 20%。 與使用 GCC 在 linux 上優化構建時間相比,購買帶有固態驅動器的更快機器似乎更容易、更便宜。

GCC 構建時間不會從預編譯頭文件中受益太多

是的,不幸的是,這通常是真的,

有一些實驗項目可以做得更好,請參閱http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3426.htmlhttp://gcc.gnu.org/wiki /pph ,但它們尚不可用。

我同意另一個答案,即 150KLOC 的 15 分鍾很慢。

我發現使用Gold鏈接器對構建時間有很大影響,我強烈推薦它。

你也可以考慮ccache這可以提供幫助,如果你在其他機器上有空閑周期distcc

避免建立在慢速磁盤上,當然避免網絡磁盤。 避免遞歸調用 make,這會花費更多時間閱讀 makefile 和重新創建依賴關系圖。 如果您可以構建您的子項目 makefile,以便它們都可以包含在單個頂級 makefile 中,那么非遞歸 make 將需要更長的時間才能開始,但一旦開始構建目標就會飛起來。 不過,重寫 makefile 可能需要做很多工作。

這可能不言而喻,但是在多核機器上構建並使用make -j N ,其中一個好的經驗法則是N應該是內核數的兩倍,如果編譯受 I/O 限制,則更多。

如果您想充分利用此功能,您需要了解如何構建項目以充分利用它們。 最好的方法是手動減少構建時間的緩慢而艱難的過程。 一開始聽起來真的很愚蠢,但如果所有構建都快 5 倍,並且您知道如何構建項目和依賴項,那么您就會意識到回報。

您可以設置一個包含目標的持續集成系統,以在發生更改時衡量和記錄您的進度/改進。

我有一個龐大的項目,大約有 150 000 LOC 的 C++ 代碼。 構建時間大約為 15 分鍾。 該項目由許多不同規模的子項目組成。

假設你有一台現代機器,聽起來它正在做很多多余的工作。

還要考慮鏈接時間。

我所有的預編譯頭文件都不是很大,每個文件大約 50Mb。

這相當大,海事組織。

我不是在談論依賴分析或高級的東西。

再次,持續集成統計。 對於緩慢的構建,過度依賴很可能是問題所在(除非您有許多小的 cpp 文件,或者正在發生諸如物理內存耗盡之類的愚蠢事情)。

我無法明顯更快地構建任何子項目,我獲得的最大加速為 20%

了解您的結構和依賴關系。 PCH 減慢了我的大部分項目。

與使用 GCC 在 linux 上優化構建時間相比,購買帶有固態驅動器的更快機器似乎更容易、更便宜。

很有可能,那台機器不會讓你的構建時間快 20 倍,但修復你的依賴項和項目結構可以讓它快 20 倍(或者無論問題的根源是什么)。 機器的幫助就這么多(考慮到 150KSLOC 的構建時間)。

您的構建可能受 CPU/內存限制。

我在生成和使用 PCH 時使用 -include 來包含包含大量標題的文件。 它有幫助,但仍然沒有那么令人印象深刻。

不過,算上你的祝福:gcc 似乎比 MSVC 快幾倍,盡管 MSVC 有更好的 PCH 支持。

目前我正在努力改善我的項目構建時間。 該項目使用 CMake 和 GCC,大約有 10 萬個 LOC,使用 Boost。

通過切換到預編譯頭,我設法將構建機器上的構建時間從 43 分鍾縮短到 35 分鍾。 我使用-ftime-report GCC 標志來獲取每個編譯階段的時間,並且我還使用輔助 Python腳本來總結所有編譯單元的時間。

這些時間幫助我理解,向項目添加預編譯頭可能會大大減少解析和預處理階段,但同時它可能會顯着增加代碼生成和優化階段。 這是因為您將所有預編譯頭數據添加到每個編譯單元,編譯器現在也需要處理這些數據。 根據這兩個貢獻,您可能會也可能不會從使用預編譯頭文件中受益。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM