web-dev-qa-db-ja.com

コンパイル時に複数のコア/プロセッサを使用するJava

8コアのデスクトップを使用してAntを使用してJavaアプリケーションを構築します(javacターゲットを介して)。複数のスレッドまたはプロセスを使用してコンパイルを高速化する方法はありますか?

複数のAntタスクを並行して実行できることは知っていますが、これを単一のコンパイルターゲットに適用できるとは思いませんか?

27
Xavier Nodet

複数のコアを効果的に利用するようにant自体に指示する方法はわかりません。ただし、 Eclipseコンパイラを使用するようにantに指示できます 、これは マルチスレッドコンパイル 組み込みをサポートしています。

17
Joachim Sauer

呼び出しているjavacがすべてのコアを使用しない限り、Antで何を言ってもかまいません。 compiler属性を使用して、タスクに使用するJavaコンパイラーを定義できます。

複数のビルドターゲットがある場合は、fork=yesを使用してターゲットを外部で実行できます。

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

2
Matti Lyra

ドキュメント は、javacで正しく機能する可能性が低いことを示しているようです。

Javadocとjavacなどの大きなAntタスクシーケンスを同時に実行しようとする人は、実行するタスクのすべての同時実行バグを識別して修正するタスクを暗黙的に引き受けます。

したがって、このタスクには用途がありますが、マルチウェイCPUでのビルド時間を短縮する簡単なトリックではなく、特定のバッチ処理またはテストの状況で使用する必要がある高度なタスクと見なす必要があります。

1
bosmacs

Buck Build を使用して、ビルド速度を上げ、複数のコアを利用できます。

一言で言えば:

Buckは、Facebookによって開発および使用されているビルドシステムです。コードとリソースで構成される小さくて再利用可能なモジュールの作成を促進し、多くのプラットフォームでさまざまな言語をサポートします。

Buckは、マシン上の複数のコアを利用するために、独立したアーティファクトを並行して構築します。さらに、変更されていないモジュールを追跡することで増分ビルド時間を短縮し、最小限のモジュールセットが再構築されます。

0
Lior

私の知る限りではありません。 Eclipseコンパイラーは、複数のコアを使用して高速化するためにいくつかの作業が行われていますが、おそらくあなたが望むほど多くは購入していません。

質問は、開発のためにインクリメンタルコンパイルを使用して、変更されたものだけを再コンパイルできるかということです。その後、完全な再構築はビルドサーバーに任せることができます。

Javacはメモリ内のすべてのファイルをプルできるため、あまり役に立たない可能性があると思います。複数のプロセスでこれを実行する必要がある場合は、作業が2倍になるだけです。ただし、2つのかなり別々のJavaコードをコンパイルする場合は、次のようにすることができます。

#!/usr/bin/env bash

javac file1.Java &
javac file2.Java &
javac file3.Java &

wait;

3つのファイルの依存関係がほとんど異なる場合は時間を節約でき、依存関係が重複している場合はおそらくそれほど時間を節約できません。

0
Alexander Mills