c/c++之類的編譯型語言採用make作為構建工具已歷史攸久。make -j的最佳引數一直都眾說紛云。
我目前見過以下幾種觀點:
與物理cpu數目相同
與cpu所有物理核心數相同
與邏輯執行緒數相同
物理核心數目乘以2
物理核心數目乘以2加1
最近恰好想起這個問題,手頭又有合適的倉庫,就做了一下測試,結果志於此。
我找了兩個c++倉庫,規模適中且相仿,均採用cmake的「原始碼外」構建方式。每個他倉庫跑10輪測試,測試指令碼如下:
for i in
do echo "**********=pass $i**********=" >> result.txt
for j in
do make clean && time -p -ao result.txt make all -j$j
done
done
即每次都將構建結果清除,再按照make -jn
的方式構建,每個倉庫跑10輪,每輪分20次,分次別以make -j1
到
make -j20
來構建,time命令用來統計時間。
所採用的機器為intel的至強cpu,8核心,8gb記憶體。
將每一輪中相同執行緒數的構建時間平均値作為最終結果。倉庫甲
乙make -j1
85.10
189.48
make -j2
45.00
101.27
make -j3
31.41
78.16
make -j4
26.57
67.88
make -j5
23.89
62.53
make -j6
22.30
59.42
make -j7
21.09
56.13
make -j8
21.05
54.42
make -j9
21.68
54.57
make -j10
21.91
54.80
make -j11
22.50
54.69
make -j12
22.40
54.75
make -j13
22.16
55.11
make -j14
22.33
55.16
make -j15
22.81
54.91
make -j16
22.81
55.39
make -j17
23.11
55.58
make -j18
23.21
55.22
make -j19
23.59
55.48
make -j20
23.55
55.35
以執行緒數為橫軸,時間為縱軸,畫成座標圖
自單執行緒始,執行緒數增大,構建時間迅速下降。到八執行緒時達到最低值。
繼續增大執行緒數,構建時間略有上公升,但總體可以認為保持不變。
無論哪個倉庫,執行緒數等於物理核數時,其構建是最快的。
測試用cpu為每個物理核心乙個邏輯執行緒,個人猜測,如果是乙個物理核心對應兩個邏輯執行緒,
則make -j16
應為最佳選項。故,當執行緒數等於物理核心數/邏輯執行緒數時,構建效率最高。
make j 引數簡介
在linux編譯程式的時候,io往往不是瓶頸,那cpu就應該是乙個影響編譯速度的重要因素了。用make j帶乙個引數,可以把專案在進行並行編譯,比如在一台雙核的機器上,完全可以用make j4,讓make最多允許4個編譯命令同時執行,這樣可以更有效的利用cpu資源。還是用kernel來測試 用mak...
make j 8引數的作用
今天在編譯安裝乙個原始碼包的時候,不小心看到乙個make j 8的引數,make命令常見用來進行編譯的,編譯完成後執行make install進行安裝,可是 j 8 是用來做什麼的?用make j帶乙個引數,可以把專案在進行並行編譯,比如在一台雙核的機器上,完全可以用make j4,讓make最多允...
python預設引數的坑以及最佳實踐
an example defaddend l end return l print addend end print addend end end 坑!對一切的列表有記憶了,不是我們想要的print的結果和想象中不同,從上述呼叫結果發現,函式每次都記住了上次新增了 end 後的list,python...