29

我使用一个具有八个内核的桌面来构建一个使用 Ant 的 Java 应用程序(通过 javac 目标)。有没有办法通过使用多个线程或进程来加快编译速度?

我知道我可以并行运行多个 Ant 任务,但我认为这不能应用于单个编译目标,不是吗?

4

6 回答 6

18

我不知道有什么方法可以告诉 ant 自己有效利用多个内核。但是您可以告诉 ant 使用 Eclipse Compiler,它内置了对多线程编译的支持。

于 2010-09-16T14:16:07.770 回答
3

只要您调用的 javac 不使用所有内核,您在 Ant 中说什么并不重要。您可以使用该compiler属性来定义应为该任务使用的 java 编译器。

如果您有多个构建目标,您可以使用fork=yes它们在外部执行目标。

http://ant.apache.org/manual/Tasks/javac.html#compilervalues

于 2010-09-16T14:18:48.360 回答
1

该文档似乎表明它不太可能与javac.

任何试图同时运行大型 Ant 任务序列(例如 javadoc 和 javac)的人都隐含地承担了识别和修复它们运行的​​任务的所有并发错误的任务。

因此,虽然此任务有用途,但应将其视为应在某些批处理或测试情况下使用的高级任务,而不是在多路 CPU 上加快构建时间的简单技巧。

于 2010-09-16T14:18:17.767 回答
1

您可以使用Buck Build来提高构建速度并利用多个内核。

简而言之:

Buck 是 Facebook 开发和使用的构建系统。它鼓励创建由代码和资源组成的小型可重用模块,并在许多平台上支持多种语言。

Buck 并行构建独立工件以利用您机器上的多个内核。此外,它通过跟踪未更改的模块来减少增量构建时间,以便重新构建最小的模块集。

于 2016-01-27T19:09:27.170 回答
0

据我所知不是。Eclipse 编译器已经完成了一些工作来加速使用多个内核,但它并没有像您希望的那样购买那么多。

问题是,你能忍受增量编译来开发,并且只重新编译那些改变的吗?然后可以将完整的重建留给构建服务器。

于 2010-09-16T14:42:34.750 回答
0

我认为它可能没有多大帮助,因为 javac 可以提取内存中的所有文件,如果它必须对多个进程执行此操作,那只会加倍努力。但是,如果你想编译两段相当独立的 Java 代码,那么你可以这样做:

#!/usr/bin/env bash

javac file1.java &
javac file2.java &
javac file3.java &

wait;

如果这 3 个文件具有大部分不同的依赖关系,那么它可能会节省时间,如果依赖关系重叠,那么它可能不会节省太多时间。

于 2019-02-12T23:31:26.773 回答