web-dev-qa-db-ja.com

なぜmavenはautomakeに比べて遅いのですか?

私は約100のモジュールで構成されるMavenプロジェクトを持っています。プロジェクトを非常に多くのモジュールに分解する理由があり、ビルドプロセスを高速化するためにそれらをマージする必要はないと思います。

私は他の人が多くのプロジェクトを読んだことがあります。たとえば、Mavenプロジェクト自体、Apache Archiva、Hudsonプロジェクトなどです。これらのプロジェクトはすべて、多かれ少なかれ100近くの多くのモジュールで構成されています。

問題は、それらをすべてビルドするには非常に多くの時間を要し、最初のビルドには3時間(ダウンロードするアーティファクトが多いため、これは許容可能)、2番目のビルドには15分(これは許容不可能)です。

Automakeの場合も同様です。最初にプロジェクトをconfigureにする必要があるとき、魔法のconfig.hファイルを準備するために、mavenの処理よりもはるかに複雑です。しかし、それはまだ高速で、私のDebianボックスではおそらく10秒です。その後、 make installの初回ビルドには、おそらく10分かかります。ただし、すべての準備が整うと、.oオブジェクトファイルが生成され、2回目のビルドで再ビルドする必要はありません。 (Mavenでは、すべてが毎回再構築されます。)

私は非常に不思議に思っています、Mavenプロジェクトで働いている人が各ビルドでこの長い時間を費やすことができるのですが、Mavenビルドのたびに落ち着いて座ることができないだけで、本当に時間がかかりすぎました。

4
Xiè Jìléi

Mavenビルドのどの部分が最も時間がかかっていますか? javacが主なボトルネックであることがわかるでしょう。おそらくそれは単体テストの実行です。テストを並行して実行してみてください。詳細がなければ、有用な答えを出すのは本当に難しいです。プロジェクトの大きさは?

ビルドはかなり並列化できますか? Maven 3を使用している場合(またはそれに切り替えた場合は、2.xと99%互換性があります)、並列ビルドを実行できます。

私はあなたのmavenのせいは見当違いであると思います。パフォーマンスに関する限り、それは実際には多くのオーバーヘッドを追加しません。私はいくつかの大きなプロジェクトを変換し、ビルドが大幅にスピードアップするのを見ました。

2
Jeff S

この比較は、まったく同じプロジェクトを構築している場合にのみ意味があります。そうでない場合は、Makeファイルをビルドして、Mavenでビルドしているのと同じプロジェクトをビルドしてみてください。

1
kevin cline

同様のケースを比較していますか。 IEは、ほぼ同じ量のコードの2つの建物です。

Mavenでビルドが非常に遅い場合、Mavenである可能性がありますが、コンパイラー自体の可能性が高くなります。 (Mavenはコンパイラを起動するだけで何もコンパイルしません)

それをより速くするために、一度に2-4のスレッドを実行する方法があるかどうかを確認してみてください。Mavenでこれを行う方法はわかりませんが、Makeでは 'make -j 4'になります。その後、ソリッドステートディスクと同様に、より多くのRAMが役立ちます。

0
Zachary K

Mavenは複雑な獣であり、私の好みでは必要以上に複雑です。発生している主要な問題は、毎回のクリーンな再構築に関係しているようです。できる限り安全であることを保証するために、クリーンな再構築にしたいリリース。デバッグビルドでは、変更内容をコンパイルするだけです。

Javaコンパイラーは、タイムスタンプが変更されていない場合(GCCの動作と同様)に何かを再コンパイルするのに十分スマートでないです。多くの場合、マルチモジュールのMavenビルドすべての依存関係を毎回ビルドする必要があります このページ は、モジュールに変更が加えられていないときにMavenが検出できないことを示しています。

要点は、ANTとMake/automakeをより直接比較できるかもしれないということですが、Mavenはそうではありません。 Mavenに組み込まれている自動マジックガジェットが多すぎるため、制御が制限されています。 yourプロジェクトの場合と同じ情報に基づいた決定を行うことはできません。これは、allのビルド問題を解決しようとしているためですプロジェクト。 Mavenはおそらく SCons または Boost Build に近いでしょう。ただし、これら2つはMavenよりも実行がはるかに高速です。

0
Berin Loritsch