为什么Java编译的并行执行在时间上呈线性增长

2022-09-01 16:04:40
time javac Main.java                                      --> 0m1.050s
time javac Main.java & javac Main.java                    --> 0m1.808s
time javac Main.java & javac Main.java & javac Main.java  --> 0m2.690s
time javac Main.java & ... 8 time                         --> 0m8.309s

当我们并行运行命令时,并且随着命令的每次增加都会添加,以使所有命令完成。javacjavac~1 secjavac

为什么时间是线性增长?

是所有过程在运行时都涉及某种上,如果是,如何克服它,以免在时间上有线性增长javaclocks


PS:我在上面尝试过,,都表现出相同的行为。single core machinedouble core machine4 core machine

PS2: 环境 ,RedHat7javac 1.7.0_79


答案 1

Java编译器已经处理了在可用处理器之间划分其工作,即使只编译单个文件也是如此。因此,自己并行运行单独的编译器实例不会产生您期望的性能提升。

为了证明这一点,我在一个名为.然后通过 制作其他副本。编译时间如下:Main1.javaMain2.javaMain8.java

单个文件编译:

time javac Main1.java &    --> (real) 11.6 sec

观察此单个文件在200-400%范围内编译,显示处理器使用率主要在200-400%范围内(表示多个CPU使用率,每个CPU为100%),偶尔在700%范围内出现峰值(此计算机上的最大值为800%,因为有8个处理器)。top

接下来,同时两个文件:

time javac Main1.java &    --> (real) 14.5 sec
time javac Main2.java &    --> (real) 14.8 sec

因此,编译两个只需要14.8秒,编译一个只需要11.6秒。这绝对是非线性的。通过查看这些运行时的情况可以清楚地看出,每个Java编译器一次最多只能利用四个CPU(偶尔峰值更高)。因此,这两个编译器在八个CPU上运行,这些CPU大多是并行的。top

接下来,同时提供四个文件:

time javac Main1.java &    --> (real) 24.2 sec
time javac Main2.java &    --> (real) 24.6 sec
time javac Main3.java &    --> (real) 25.0 sec
time javac Main4.java &    --> (real) 25.0 sec

好了,我们碰壁了。我们不能再并行化编译器。四个文件花了25秒,而两个文件花了14.8秒。这里有一点优化,但它主要是线性时间增加。

最后,同时八个:

time javac Main1.java &    --> (real) 51.9 sec
time javac Main2.java &    --> (real) 52.3 sec
time javac Main3.java &    --> (real) 52.5 sec
time javac Main4.java &    --> (real) 53.0 sec
time javac Main5.java &    --> (real) 53.4 sec
time javac Main6.java &    --> (real) 53.5 sec
time javac Main7.java &    --> (real) 53.6 sec
time javac Main8.java &    --> (real) 54.6 sec

这实际上比线性更糟糕,因为八个只需要54.6秒,而四个只需要25.0。

因此,我认为从所有这些中得出的结论是要相信编译器会做得很好,试图在可用的CPU资源中优化你给它的工作,并且尝试手动添加额外的并行化将带来有限的(如果有的话)好处。

编辑:

作为参考,我在Oracle的错误数据库中发现了两个关于增强javac以利用多个处理器的条目:

  • Bug ID: JDK-6629150 -- 最初的投诉,这最终被标记为以下文件的副本:
  • 错误 ID:JDK-6713663 -- 建议解决方法,根据“解决日期”,javac 中的多处理器支持似乎是在 2008-06-12 上添加的。

答案 2

推荐