Java编译器已经处理了在可用处理器之间划分其工作,即使只编译单个文件也是如此。因此,自己并行运行单独的编译器实例不会产生您期望的性能提升。
为了证明这一点,我在一个名为.然后通过 制作其他副本。编译时间如下:Main1.java
Main2.java
Main8.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以利用多个处理器的条目: