是否有任何将相对预期任务时间纳入计划的构建系统?


13

这是我的问题的一个小例子:

假设一个构建作业包含名为AD的4个独立任务。总而言之,D花费的时间比AC花费的时间更长。

无法包含相对任务时间的构建系统可能会安排如下任务:

---------------------------------------
CPU1: A  |    C   |
---------------------------------------
CPU2: B    | D                        |
---------------------------------------

相反,如果调度程序知道任务时间差异,则可以提出以下更短的调度:

---------------------------------------
CPU1: A  |  B    |   C   |
---------------------------------------
CPU2: D                        |
---------------------------------------

我的问题:

  1. 是否有任何将相对预期任务时间纳入计划的构建系统?
  2. 对于这种构建系统有哪些学术研究?
  3. 这些构建系统(如果存在)从哪里获取时间信息?试探法,以前的构建过程中收集的时间?
  4. 如果不存在这样的构建系统,为什么?是否有一个陷阱使他们不如乍一看看上去那么有价值?

3
有关第三方资源或工具的大多数问题都很快就被“脱题”了,但我想这可能是一个边缘案例,似乎很适合本网站的范围。
布朗

1
我认为这是基于错误的假设,即“构建”任务是非并行的。
dagnelies

在大多数情况下,构建任务确实是非并行的,但是可以,例如,多线程应用程序中的单元测试实际上可以是并行的。实际上,在我工作的项目中,对于单元测试运行,我们总是必须用“ -j1”调用“ make”,因为否则与性能相关的多核单元测试会失败。
juhist

@juhist如果您有兴趣切换到更具表现力的构建系统,shake会提供资源概念,例如,您可以定义应为单元测试保留多少个CPU内核。
sjakobi'2

Answers:


3

Microsoft Visual Studio Team System(以前称为TFS)确实考虑了构建动作时间和并行构建;它从以前的构建历史中获取数据;虽然我不认为您可以开箱即用地获得所需的行为,但是您可以对其进行自定义。

一些优化性能的自定义任务的示例

https://veegens.wordpress.com/2013/03/26/tfs-2010-build-performance-report/


如果我正确理解了您的答案和链接,则会报告构建操作时间(这是很常见的功能),但尚不清楚是否或如何将这些时间用于改善构建进度。这似乎并没有真正回答我的原始问题,所以我不会将悬赏奖励给您。
sjakobi'2

没问题,您可能错过的是可以通过编程自定义构建动作和构建过程。该示例正在报告,但如上所述,历史记录用于自动优化。另外,请注意,您可以配置并行构建。但是,为了确保它们按照您的算法并行化,您可能需要使用代码进行自定义。一些附加参考: dotnetcurry.com/visualstudio/1177/...
布鲁诺瓜

2
@BrunoGuardia:您能解释一下链接的文章中提到的自定义选项,该选项可以帮助利用构建操作的预期任务时间吗?
Doc Brown

0

这是基于错误的假设,即“构建”任务是非并行的。

许多编译器使用多线程,因此单个任务A将使用所有CPU。因此,顺序无关紧要。对于受I / O约束的任务,尤其是涉及网络的任务,最好也从头开始并行执行所有任务:大多数时间都在等待答案上。

换句话说,顺序无关紧要,因为通常将各个任务并行化(例如编译)


编辑:

实际上,“ CPU 1上的任务A”的概念也存在缺陷。即使对于单线程任务,调度进程/线程的OS也会在每个上下文切换器中将其从CPU转移到CPU。我想大多数构建系统只会并行运行所有任务,而让OS进行调度。更长的任务将花费更长的时间,仅此而已。

假设您有一个不受I / O约束的长期运行的单线程任务,那么构建系统为其分配优先级/重要性将很容易,而不是尝试延迟较小的任务以减少来自OS的上下文切换。

即使您有如此奇怪的任务,这在实践中很少见,并且有一个花哨的调度构建系统,该系统可以基于以前的运行(唯一的了解方法)对启发式算法进行工作,但从中获得的收益可能会很小。但是,您需要维护很多额外的复杂性。


“任务内”并行性是一个有趣的方面,无疑为优化提供了额外的潜力,但我认为假设任何给定任务都可以有效地扩展到任意数量的CPU并没有比假设每个任务必须在其中运行更好。一个核心。
sjakobi'2

@sjakobi:嗯,实际上,编译器必须高效。您是否可以想象,由于仅使用了16个内核中的1个内核,因此等待了很长时间进行编译?那是不行的。使用所有理论,您似乎都忽略了现实。调度是一个非常有趣且非常有意义的主题。只是恕我直言,在构建系统的上下文中相对没有用。再说一次,如今大多数编译器无论如何都是多线程的……如果没有的话,应该花更多的精力在调度构建系统上。
dagnelies

2
所有用于C ++或C或Fortran或Ada的免费软件编译器(GCCClang ...)都是单线程的。构建系统(make -j)可以并行启动多个编译过程。
巴西尔·斯塔林凯维奇

@BasileStarynkevitch:...的确。基本上,每个人都理智地使用,-j <nb-cores>但可悲的是默认值仍为“ 1” ...我仍然感到惊讶,它从未更改。
dagnelies

@dagnelies:大量的Makefile缺少一些关键的依赖项,因此在N> 1的-jN下不起作用(或可能不起作用)。
juhist
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.