背景
C/C++之类的编译型语言采用make作为构建工具已历史攸久。make -j的最佳参数一直都众说纷云。
我目前见过以下几种观点:
-
与物理CPU数目相同
-
与CPU所有物理核心数相同
-
与逻辑线程数相同
-
物理核心数目乘以2
-
物理核心数目乘以2加1
最近恰好想起这个问题,手头又有合适的仓库,就做了一下测试,结果志于此。
测试方法
我找了两个C++仓库,规模适中且相仿,均采用CMake的“源码外”构建方式。每个他仓库跑10轮测试,测试脚本如下:
for i in {1..10}
do
echo "===========pass $i===========" >> result.txt
for j in {1..20}
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
应为最佳选项。故,当线程数等于物理核心数/逻辑线程数时,构建效率最高。
原文链接: https://www.cnblogs.com/wxxr/p/13054185.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/203917
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!