性能—是否可以并行编译大型java模块?

kcwpcxri  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(470)

我知道可以使用多个线程来编译多个模块,每个线程编译一个模块,但是如果我有一个大模块呢?javac或eclipsejava编译器是否支持并行编译单个模块(使用多个线程)?或者有其他的java编译器支持它吗?
更新:我用~50k个简单方法创建了一个java源文件(仅用于此测试),例如:

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;
    }

这些方法互不依赖,因此编译可以并行进行(至少在理论上是这样)。使用编译此文件 Javac 在我的12核+ht机器上,cpu使用率平均为20%,而峰值很短,高达50%。这使我相信,虽然有一些Paralalization做了内部 Javac ,真的很小。
有趣的是,如果我用相同数量的方法创建2、3或4个类,并用一个 Javac 进程,我无法获得更高的cpu使用率。编译所花费的时间是原来的2倍、3倍、4倍,这表明javac并没有并行编译这些完全不相关的类。但是如果我启动单独的javac进程来分别编译这些文件,当4个文件(= Javac 进程),编译时间仅比编译单个文件(相比之下,编译单个文件)高5-10% Javac 在编译所有这4个文件的过程中,编译需要花费400%的时间)。
所以我的意见是 Javac 确实使用多个线程来编译文件,但是它被限制为4个线程,不能完全利用12核机器。在我看来 Javac 串行编译多个文件,它只使用核心/线程并行编译单个文件(我相信编译单个文件时,某些部分可以并行完成,这就是javac所做的,但是并行编译多个文件怎么办?如果我有100个独立的文件,我应该可以看到我的cpu跳到100%,这不是事实。)

np8igboo

np8igboo1#

javac 总是单线程运行。有一个提高javac性能的例子jdk-4229449:rfe:请多线程javac以获得更好的性能,但是oracle不打算改变编译架构。

wljmcqd8

wljmcqd82#

是的,可以并行构建java代码。
java编译器( javac )maven本身并不能做到这一点,但是maven和ant(以及make的一些版本)都可以运行多个 javac 并行示例。
此外,eclipsejava编译器是多线程的,您可以告诉maven使用它来代替它 javac ; 看到了吗https://stackoverflow.com/a/3727542/139985
我注意到您的示例涉及到使用大量方法编译单个类。并行编译器示例对此没有帮助。eclipse编译器可能会有所帮助,具体取决于它的实现方式。
然而,我告诉你们,这是一个不切实际的例子。在现实生活中,人们不会这样写代码,代码生成器可以(也应该)编写成不发出那样的源代码。
他们的同事会反抗。。。

相关问题