2,509クラスのモジュール用のJavadocを構築しています。現在、これには1秒あたり7分または6ファイルかかります。
私が試してみました
mvn -T 1C install
ただし、javadoc
は1つのCPUしか使用しません。より多くを使用したり、スピードアップしたりする方法はありますか?
Oracle JDK 8 update 112を使用しています。私の開発マシンには16コアと128GBのメモリがあります。
フライトレコーダーを実行しているスレッドが1つしかないことがわかりますmain
興味のある人のために、私は次のオプションを使用しました:
<plugin>
<artifactId>maven-javadoc-plugin</artifactId>
<configuration>
<additionalJOptions>
<additionalJOption>-J-XX:+UnlockCommercialFeatures</additionalJOption>
<additionalJOption>-J-XX:+FlightRecorder</additionalJOption>
<additionalJOption>-J-XX:StartFlightRecording=name=test,filename=/tmp/myrecording-50.jfr,dumponexit=true</additionalJOption>
<additionalJOption>-J-XX:FlightRecorderOptions=loglevel=debug</additionalJOption>
</additionalJOptions>
</configuration>
</plugin>
注:1つの回避策は次のことです。
-Dmaven.javadoc.skip=true
-T1Cを指定してmavenを実行すると、mavenはモジュールを並列にビルドしようとします。したがって、マルチモジュールプロジェクトがある場合、せいぜい各モジュールのjavadocを並列にビルドします(モジュール間の依存関係グラフで許可されている場合)。
Javadocプロセス自体はシングルスレッドであるため、複数のコアを使用して1つのモジュールのjavadocを生成することはできません。
ただし、多くのクラス(およびおそらく多くの@linkドックレットなど)があるため、javadocプロセスは拡張ヒープの恩恵を受ける可能性があります。 GCアクティビティを調べましたか?これを構成に追加してみて、役立つかどうかを確認してください。
<additionalJOption>-J-Xms2g</additionalJOption>
<additionalJOption>-J-Xmx2g</additionalJOption>
@lbndevは、少なくともJavadocで提供されるデフォルトのDoclet(_com.Sun.tools.doclets.formats.html.HtmlDoclet
_)では正しいです。ソースを調べると、シングルスレッドの実装が確認されます。
new ClassTree()
が呼び出されます。これは ClassTree.buildTree() を呼び出します。これは、for
ループを使用してクラスのリストを反復し、クラスのモデルを生成します。for
ループです。package.allClasses()
を繰り返します。これもfor
ループで繰り返されます。(これらのリンクはJDK8ソースへのリンクです。JDK11ではクラスは移動しましたが、for
とHtmlDoclet
の基本的なAbstractDoclet
ループはまだあります。)
一部のサンプルベースのプロファイリングにより、これらがボトルネックとなっているメソッドであることが確認されました。
これはあなたが聞きたいと思っていることではありませんが、少なくとも単一のMavenモジュール内では、マルチスレッド用の現在の標準Javadocにはオプションがないように見えます。
generateClassFiles()
などは、少しのマルチスレッド化に適していますが、これはおそらくJDKの変更である必要があります。以下で説明するように AbstractDoclet.isValidDoclet()HtmlDoclet
のサブクラス化もアクティブにブロックします。これらのループの一部をサードパーティとして再実装しようとすると、他の多くのコードを取り込む必要があります。
他のDoclet実装(例: javadown )をスキャンしたところ、パッケージとクラスのドリルダウンに関する同様の実装スタイルしか見つかりませんでした。このスレッドの他の人がもっと知っている可能性があります。
もう少し広く考えると、 DocFileFactory を調整する余地があるかもしれません。内部クラスとして明確にマークアップされていますが(パッケージでは公開されていません)、(HTML)ファイルの書き込みを抽象化します。これの代替バージョンは、HTMLをメモリにバッファリングするか、Zipファイルに直接ストリーミングして、IOパフォーマンスを向上させる可能性があります。しかし、明らかに、これは変更のリスクも理解する必要があります。 JDKツールで。
javadoc、および標準のドックレットは、現在、基本的にシングルスレッドです。
主に並列にページを生成することによってこれを改善することは「レーダー上」ですが、これは、MTの安全性をさまざまな共有データ構造に後付けすることを意味します。
Mavenで、すべてのコアのコアごとに複数のスレッドを使用することができます。
例えば。
mvn -T 4C install # will use 4 threads per available CPU core
上記の4
は任意の番号に変更できます。あなたはたくさんのリソースを持ったマシンを持っています。 8
または16
を試してください。
また、javadoc-no-fork
を使用してみましたか?これにより、javadocが2回目にトリガーされないようになります https://maven.Apache.org/plugins/maven-javadoc-plugin/examples/javadoc-nofork.html
Mavenのカスタマイズは、javadocの生成を高速化する方法です。
別のアプローチは、javadocの生成に使用されるドックレットを変更することです。 Maven javadocプラグインを使用すると、javadocの生成に使用されるドックレットを変更できます。
https://maven.Apache.org/plugins/maven-javadoc-plugin/examples/alternate-doclet.html
私は、従来のjavadocよりも高速であると主張する次の商用ドックレット(私はそれらとは一切関係ありません)を見つけました。無料/トライアル/商用ライセンスを提供します。 javadocビルドを本当にスピードアップしたいのであれば、価格に見合う価値があるかどうかを調べる価値があるかもしれません。
http://www.filigris.com/docflex-javadoc
たぶん、オープンソースの代替手段がインターネット上に存在します...