web-dev-qa-db-ja.com

Javadocを高速化する方法はありますか(7分かかります)

2,509クラスのモジュール用のJavadocを構築しています。現在、これには1秒あたり7分または6ファイルかかります。

私が試してみました

mvn -T 1C install

ただし、javadocは1つのCPUしか使用しません。より多くを使用したり、スピードアップしたりする方法はありますか?

Oracle JDK 8 update 112を使用しています。私の開発マシンには16コアと128GBのメモリがあります。

フライトレコーダーを実行しているスレッドが1つしかないことがわかりますmain

enter image description here

興味のある人のために、私は次のオプションを使用しました:

<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
44
Peter Lawrey

-T1Cを指定してmavenを実行すると、mavenはモジュールを並列にビルドしようとします。したがって、マルチモジュールプロジェクトがある場合、せいぜい各モジュールのjavadocを並列にビルドします(モジュール間の依存関係グラフで許可されている場合)。

Javadocプロセス自体はシングルスレッドであるため、複数のコアを使用して1つのモジュールのjavadocを生成することはできません。

ただし、多くのクラス(およびおそらく多くの@linkドックレットなど)があるため、javadocプロセスは拡張ヒープの恩恵を受ける可能性があります。 GCアクティビティを調べましたか?これを構成に追加してみて、役立つかどうかを確認してください。

<additionalJOption>-J-Xms2g</additionalJOption>
<additionalJOption>-J-Xmx2g</additionalJOption>
6
lbndev

@lbndevは、少なくともJavadocで提供されるデフォルトのDoclet(_com.Sun.tools.doclets.formats.html.HtmlDoclet_)では正しいです。ソースを調べると、シングルスレッドの実装が確認されます。

(これらのリンクはJDK8ソースへのリンクです。JDK11ではクラスは移動しましたが、forHtmlDocletの基本的なAbstractDocletループはまだあります。)

一部のサンプルベースのプロファイリングにより、これらがボトルネックとなっているメソッドであることが確認されました。 Javadoc-profiling

これはあなたが聞きたいと思っていることではありませんが、少なくとも単一のMavenモジュール内では、マルチスレッド用の現在の標準Javadocにはオプションがないように見えます。

generateClassFiles()などは、少しのマルチスレッド化に適していますが、これはおそらくJDKの変更である必要があります。以下で説明するように AbstractDoclet.isValidDoclet()HtmlDocletのサブクラス化もアクティブにブロックします。これらのループの一部をサードパーティとして再実装しようとすると、他の多くのコードを取り込む必要があります。

他のDoclet実装(例: javadown )をスキャンしたところ、パッケージとクラスのドリルダウンに関する同様の実装スタイルしか見つかりませんでした。このスレッドの他の人がもっと知っている可能性があります。

もう少し広く考えると、 DocFileFactory を調整する余地があるかもしれません。内部クラスとして明確にマークアップされていますが(パッケージでは公開されていません)、(HTML)ファイルの書き込みを抽象化します。これの代替バージョンは、HTMLをメモリにバッファリングするか、Zipファイルに直接ストリーミングして、IOパフォーマンスを向上させる可能性があります。しかし、明らかに、これは変更のリスクも理解する必要があります。 JDKツールで。

4
df778899

javadoc、および標準のドックレットは、現在、基本的にシングルスレッドです。

主に並列にページを生成することによってこれを改善することは「レーダー上」ですが、これは、MTの安全性をさまざまな共有データ構造に後付けすることを意味します。

0

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

0
Arun Avanathan

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

たぶん、オープンソースの代替手段がインターネット上に存在します...

0
Mumrah81