分布式編譯之本地分布

2022-03-07 15:58:31 字數 1873 閱讀 1545

眾所周知,

c++專案的編譯時間一般都很就,稍微大一點的專案完全編譯可能就需要幾十分鐘,有的可能需要好幾個小時甚至更久。這對於現在的開發人員來說是非常難以忍受的一件事情!所以就有人開發了一種叫做分布式編譯的東西,這個東西的思想其實很簡單,就是把乙個專案中的沒有依賴關係的工程分給不同的機器進行同時編譯,編譯完以後把編譯出來的結果傳回來。這樣的話理論上來說,如果網路內可用的空閒機器數量足夠,編譯時間可以縮短到乙個很短的範圍內。但是不排除網路通訊上的影響因素。

當前分布式編譯的軟體有很多,比如說

xoreax

的incredibuild

,這個特點是能夠與

visual studio

很好的相容;開源的

distcc

可以提供在

linux

作業系統下的分布式編譯,其他還有很多的分布式編譯軟體都可以進行分布式編譯,它們各自有各自的優缺點。

今天我要介紹的主要是如何在本地提高編譯的效率。我們大多數人都不可能像公司一樣擁有很多數量的機器給我們用來編譯,我們也不需要這麼多機器。隨著現在

cpu的核心數量逐漸增多,我們應該充分利用這個資源來幫助我們提高編譯效率。我們一般在使用

visual studio

去build

的時候它會起乙個

msbuild

的程序來對我們的專案進行編譯,很明顯這不能發揮我們多核的優勢。

做了乙個小實驗來驗證一下

msbuild的」

平行編譯

」的效率,

test.sln有4

個project

,每個project

有乙個main

函式,包含

1000

行」hello world」

。系統配置雙核

2.1ghz。直接

build (

命令: msbuild test.sln),

用時: 14.75 s

呼叫兩個程序

build (

命令: msbuild /m:2 test.sln),

用時: 9.85 s

呼叫三個程序

build (

命令: msbuild /m:3 test.sln),

用時: 11.06 s

呼叫四個程序

build (

命令: msbuild /m:4 test.sln),

用時: 10.09 s

< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />

從以上的實驗我們可以得出結論,並非分配的程序越多越好,因為計算機本身

cpu的核心書限制,對於這個實驗來說如果分配兩個程序,那麼正好可以被分配到兩個

cpu中這樣就可以很大程度上的提高程式設計效率。但是當多餘

2個程序時,就並非真正的併發編譯,所以效率也不會提高很多。

乙個msbuild

程序會去編譯乙個

project

,如果你需要編譯的專案中只有乙個

project

的話,那麼這個並不會提高你的編譯速度。

另外,如果說這個專案中各個工程之間有依賴關係的話,效率提高也就沒那麼的高,因為在有依賴關係的工程必須順序編譯而不能並行編譯。

此外對於為何

msbuild

會起多個程序去編譯而非建立執行緒去編譯,是因為乙個程序只能訪問當前目錄,不管你有多少個執行緒。

關於在多核環境下

msbuild

的並行編譯可以去閱讀這篇文章:

faster builds with msbuild using parallel builds and multicore cpus

,其中有詳細的說明。

分布式編譯

這是乙個對應visual c 的分布式編譯軟體,通過visual c 強大的ide擴充套件功能,它有著非常友好的介面,可以將整個分布式編譯過程直觀的展現給使用者,並且它通過乙個 虛擬機器 的技術,使能編譯的參與者可以與編譯發起者有著不同的系統配置 windows作業系統版本,庫檔案等 甚至無需在參與...

分布式 分布式鎖

本質是利用redis的setnx 方法的特性來加鎖,setnx 即key不存在則設定key,否則直接返回false,要求在分布式系統中使用同乙個redis服務,以下提供兩種解決方案 1 直接使用redistemplate 這其實並不能完全保證高併發下的安全問題,因為可能在鎖過期之後該執行緒尚未執行完...

分布式 分布式事務

是資料庫執行過程中的乙個邏輯單位,由乙個有限的資料庫操作序列構成。事務的acid四大特性 原子性 atomicity 事務作為乙個整體被執行。一致性 consistency 從乙個一致的狀態轉換到另乙個一致的狀態。隔離性 isolation 多個事務併發執行時,併發事務之間互相影響的程度。永續性 d...