是否可以并行编译大型 Java 模块?

Is it possible to compile a large Java module in parallel?

我知道可以使用多个线程编译多个模块,其中每个线程编译一个模块,但是如果我有一个大模块怎么办? 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 编译此文件会导致平均 20% CPU 使用率和高达 50% 的非常短的峰值。这让我相信,虽然在 Javac 内部进行了一些并行化,但它确实很小。

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

所以我的意见是 Javac 确实使用多线程编译文件,但它仅限于 ~4 个线程,它不能充分利用 12 核机器。另外对我来说,似乎 Javac 串行编译 多个 文件,它只使用 cores/threads 并行编译单个文件(我相信当单个文件编译后,某些部分可以并行完成,这就是 Javac 所做的,但是并行编译多个文件呢? 如果我有 100 个独立的文件,我应该能够看到我的 CPU 跳到 100%,但事实并非如此。)

javac 总是单线程运行。有提高 javac 性能的案例 JDK-4229449 : RFE: Please multithread javac for better performance 但是 Oracle 不打算更改编译体系结构。

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

Java 编译器 (javac) 本身不会这样做,但是 Maven 和 Ant(以及某些版本的 Make)都可以 运行 多个 javac并行实例。

此外,Eclipse Java 编译器是多线程的,您可以告诉 Maven 使用它而不是 javac;见


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

但是,我告诉你这是一个不切实际的例子。人们不会在现实生活中编写那样的代码1,代码生成器可以(并且应该)被编写为不发出那样的源代码。

1 - 他们的同事会反抗...