gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:17:38 25 4
gpt4 key购买 nike

我知道可以使用多个线程编译多个模块,其中每个线程编译一个模块,但是如果我有一个大模块怎么办? Javac 或 Eclipse Java 编译器是否支持并行编译单个模块(使用多个线程)?还是有其他支持它的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 机器上导致平均 20% 的 CPU 使用率和高达 50% 的非常短的峰值。这让我相信,尽管在 Javac 内部进行了一些并行化。 ,真的是微不足道。
有趣的问题是,如果我使用相同数量的方法创建 2、3 或 4 个类并使用单个 Javac 同时编译它们过程中,我无法获得更高的 CPU 使用率。编译花费的时间正好是 2x、3x、4x,这表明 Javac 不会并行编译这些完全不相关的类。但是如果我启动单独的 Javac 进程来分别编译这些文件,当使用 4 个文件(= Javac 进程)时,CPU 会跳到几乎 100%,编译时间仅比编译单个文件高 5-10%(比较至此,单个 Javac 进程编译所有这 4 个文件,编译时间增加了 400%)。
所以我的看法是 Javac确实使用多线程编译文件,但它仅限于约 4 个线程,它不能充分利用 12 核机器。在我看来, Javac编译 多个 串行文件,它只使用内核/线程并行编译单个文件(我相信当编译单个文件时,某些部分可以并行完成,这就是Javac所做的, 但是编译多个并行文件?如果我有 100 个独立的文件,我应该能够看到我的 CPU 跳到 100%,但事实并非如此。)

最佳答案

是的,可以并行构建 Java 代码。
Java 编译器(javac)本身不这样做,但 Maven 和 Ant(以及某些版本的 Make)都可以运行多个 javac并行实例。
此外,Eclipse Java 编译器是多线程的,您可以告诉 Maven 使用它而不是 javac。 ;见 https://stackoverflow.com/a/3727542/139985

我注意到您的示例涉及使用大量方法编译单个类。并行编译器实例对此无济于事。 Eclipse 编译器可能会有所帮助,具体取决于它的实现方式。
但是,我告诉你,这是一个不切实际的例子。人们不会在现实生活中编写那样的代码1,并且可以(并且应该)编写代码生成器以不发出那样的源代码。
1 - 他们的同事会反抗......

关于java - 是否可以并行编译大型 Java 模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65466588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com