有可能并行编译一个大型Java模块吗



我知道可以使用多个线程编译多个模块,其中每个线程编译一个模块,但如果我有一个大模块呢?Javac或Eclipse Java编译器是否支持并行编译单个模块(使用多个线程(?或者有其他Java编译器支持它吗?

更新:我创建了一个Java源文件,其中包含大约50k个简单方法(仅用于此测试(,例如:

static int add1(int a, int b, int c) {
return 2 * a + 55 * b - c;
}
static int add2(int a, int b, int c) {
return 2 * a + 55 * b - c;
}
static int add3(int a, int b, int c) {
return 2 * a + 55 * b - c;
}

这些方法并不相互依赖,因此汇编可以并行进行(至少在理论上是这样(。在我的12核+HT机器上用Javac编译这个文件,平均CPU使用率为20%,峰值达到50%。这让我相信,尽管Javac内部有一些重复,但它确实很小。

有趣的是,如果我用相同数量的方法创建2、3或4个类,并用一个Javac进程同时编译它们,我就无法获得更高的CPU使用率。编译需要2倍、3倍、4倍的时间,这表明Javac不会并行编译这些完全不相关的类。但是,如果我启动单独的Javac进程来单独编译这些文件,当使用4个文件(=Javac进程(时,CPU会跳到几乎100%,编译时间仅比编译单个文件高5-10%(相比之下,单个Javac进程编译所有这4个文件,编译所需时间要长400%(。

因此,我的观点是,Javac确实使用多个线程编译文件,但它有点局限于~4个线程,它不能完全利用12核机器。而且在我看来,CCD_ 7串行编译多个文件,它只使用核心/线程并行编译单个文件(我相信当编译单个文件时,某些部分可以并行完成,这就是Javac所做的,但并行编译多个文件呢?如果我有100个独立的文件,我应该能够看到我的CPU跳到100%,但事实并非如此。(

是的,可以并行构建Java代码。

Java编译器(javac(本身不执行此操作,但Maven和Ant(以及Make的某些版本(都可以并行运行多个javac实例。

此外,Eclipse Java编译器是多线程的,您可以告诉Maven使用它而不是javac;看见https://stackoverflow.com/a/3727542/139985


我注意到您的示例涉及到用大量方法编译单个类。并行编译器实例对此没有帮助。Eclipse编译器可能会提供帮助,具体取决于它的实现方式。

然而,我告诉你,这是一个不切实际的例子。在现实生活中,人们不会写这样的代码1,代码生成器可以(也应该(不发出这样的源代码。

1-他们的同事会反抗

javac总是单线程运行。有一个改进javac性能的例子JDK-4229449:RFE:请多线程javac以获得更好的性能,但Oracle不打算更改编译体系结构。