2015-12-11 136 views
2

這是一個理論問題。不同機器之間的拆分編譯

比方說,我有1000臺Raspberry Pi Zero計算機,我希望他們都能編譯一個巨大的C++項目。我可以向每臺機器發送一個源文件,以便編譯所需的每個依賴項(頭文件),並使本機僅編譯一個單元以生成obj文件。在生成所有obj文件後,我需要將它們鏈接起來。我不確定我可以分割一個連接步驟,對我來說,它看起來像一個單一的過程,但我們可以說我有一個專用的強大的單機來做到這一點。

所以這個問題 - 它會在理論上起作用嗎?我的項目編譯速度會快1000倍嗎?鏈接過程是否很重?與預處理器/編譯步驟相比,需要多少時間?

+1

我們這樣做(雖然與Raspberry Pi不同,但是具有全功能的計算機),並且每當需要重建巨大的代碼庫時,都可以加快編譯速度。雖然不是1000x,但我們不使用那麼多節點。此外,雖然我們使用一些家庭建立系統,但我不相信沒有這種支持的標準構建系統存在。 – Petr

+1

是的,它們存在。我們使用IncrediBuild,但許可證實際上是昂貴的,正如我之前提到的,我的問題比理論更具理論性。 – nikitablack

回答

2

您可以使用諸如distcc之類的工具在多臺計算機之間分配編譯。你得到多少加速取決於你的特定項目(例如源文件的大小和複雜性,編譯計算機的速度,網絡延遲等)。您可以進行小規模測試並進行測量。

正如你所說,鏈接往往是一個單一的過程,可能是一個大型項目的瓶頸。另一種方法是將你的項目分成幾個共享庫。然後,每次進行小的更改時都不需要很大的鏈接步驟,但啓動可執行文件可能會比較慢,因爲必須在運行時執行某些鏈接。

如果對項目的幾個部分進行更改,可以並行構建和鏈接這些庫。

在編譯與鏈接上花費多少時間取決於您的項目。

+0

是的,我看到了distcc項目,但自從上次更新源代碼2年前完成後,我對此感到懷疑,我不確定它是否適用於現代編譯器,但也許我錯了。 – nikitablack

相關問題