我的makefile包含具有短需求和许多其他短任务的单个长任务。使太长时间的任务开始。因此总执行时间不是最佳的。简化示例:
sleep = ping 1.1.1.1 -n 1 -w $(1)000 > nul || exit 0
all : m6 m5 m4 m3 m2 m1
m1 :
$(call sleep, 6)
m2 :
$(call sleep, 6)
m3 :
$(call sleep, 6)
m4 :
$(call sleep, 6)
m5 : m6
$(call sleep, 20)
m6 :
$(call sleep, 4)
使用' make -j 2'执行。目前的执行计划是:
[m6][-m3-][-m1-]
[-m4-][-m2-][--------m5--------]
即G。 32秒最佳执行计划是:
[-m1-][-m2-][-m3-][-m4-]
[m6][--------m5--------]
即G。 24秒如何丰富最佳执行时间?
答案 0 :(得分:0)
我不知道你怎么可能期望为你做这件事。它可能不知道你的哪些工作需要很长时间,哪些工作不需要。
make需要支持长度估计注释或类似的东西才能开始实现。
答案 1 :(得分:0)
始终以相同的顺序启动作业,从第一个先决条件开始到最后一个。因此,如果您将所有长期运行的先决条件放在先决条件列表中,那么您的构建将“更加优化”。从理论上讲,你可以通过命令来接近最优:
all : m5 m4 m3 m2 m1 m6
简短的回答是,make无法知道事情需要多长时间,也没有办法告诉你某些命令会很慢或估计它们需要多长时间,内部也没有任何基础设施这样做可以利用这些信息产生“最佳订单”,即使它是可用的。
最后,由于作业服务器跨越多个make实例,如果你有递归的make调用,所有的共享同一个作业池,并且这些make实例无法将估计的作业时间相互通信,那么整个事情就是没有一般可行。
您可以做的最好的事情是根据您对构建时间的了解,安排您的先决条件的顺序尽可能高效。