make -j的最佳参数

背景

C/C++之类的编译型语言采用make作为构建工具已历史攸久。make -j的最佳参数一直都众说纷云。
我目前见过以下几种观点:

  1. 与物理CPU数目相同

  2. 与CPU所有物理核心数相同

  3. 与逻辑线程数相同

  4. 物理核心数目乘以2

  5. 物理核心数目乘以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应为最佳选项。故,当线程数等于物理核心数/逻辑线程数时,构建效率最高。

posted @ 2020-10-13 17:22  戊戌乡人  阅读(3507)  评论(0)    收藏  举报