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

以线程数为横轴,时间为纵轴,画成坐标图

make -j的最佳参数

自单线程始,线程数增大,构建时间迅速下降。到八线程时达到最低值。
继续增大线程数,构建时间略有上升,但总体可以认为保持不变。
无论哪个仓库,线程数等于物理核数时,其构建是最快的。

结论

测试用CPU为每个物理核心一个逻辑线程,个人猜测,如果是一个物理核心对应两个逻辑线程,
make -j16应为最佳选项。故,当线程数等于物理核心数/逻辑线程数时,构建效率最高。

原文链接: https://www.cnblogs.com/wxxr/p/13054185.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    make -j的最佳参数

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/203917

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午9:41
下一篇 2023年2月12日 下午9:41

相关推荐