gwtコンパイラを高速化するにはどうすればよいですか?


201

プロジェクトでGWTをより多く使用するようになり、GWTコンパイラーのパフォーマンスはますます煩わしくなっています。

ホストモードのブラウザーに重点を置き、後でGWTコンパイラーを実行する必要性を延期するなど、問題を軽減するために作業手順を変更し始めますが、これには独自のリスク、特に実際のブラウザの問題をキャッチするのは、私たちが望むよりもずっと遅くなります。

理想的には、GWTコンパイラー自体をより速くしたいのですが、かなり小さなアプリケーションをコンパイルするのに1分かかるのです。しかし、私はかなりナイーブな方法でコンパイルを使用しているので、いくつかの迅速かつ簡単な利益を得ることができると期待しています。

現在、ant。Antターゲットから、最大256mのヒープと大量のスタックスペースを持つJavaアプリケーションとしてcom.google.gwt.dev.Compilerを呼び出しています。コンパイラーはAntによってfork = trueと最新のJava 6 JREを使用して起動され、Java6の改善されたパフォーマンスを利用しようとします。メインのコントローラークラスをアプリケーションのクラスパスと一緒にコンパイラーに渡します。

速度を上げるために他に何ができますか?より多くの情報を提供して、何をすべきかを発見する時間を短縮できるでしょうか?

1つのブラウザーでのみコンパイルするように指示できることはわかっていますが、マルチブラウザーテストを実行する必要があるため、実際的ではありません。

この時点ですべての提案を歓迎します。

回答:


144

不快な真実から始めましょう:GWTコンパイラーのパフォーマンスは本当にお粗末です。あちこちでハックを使用できますが、パフォーマンスが大幅に向上することはありません。

次の行をに挿入して、特定のブラウザのみをコンパイルすることで、パフォーマンスを向上させることができますgwt.xml

<define-property name="user.agent" values="ie6,gecko,gecko1_8"></define-property>

またはgwt 2.x構文で、1つのブラウザーのみ:

<set-property name="user.agent" value="gecko1_8"/>

これは、たとえば、IEとFFのみのアプリケーションをコンパイルします。テストに特定のブラウザのみを使用していることがわかっている場合は、この小さなハックを使用できます。

別のオプション:複数のロケールを使用していて、テストに1つだけを使用している場合は、それらすべてをコメントアウトして、GWTがデフォルトのロケールを使用するようにすると、コンパイル時の追加のオーバーヘッドがなくなります。

結論:コンパイラのパフォーマンスが大幅に向上することはありませんが、いくつかの緩和策を講じれば、あちこちで数分を削ることができます。


3
GWT 2.0の場合に表示されますが、実際には次の構文でユーザーエージェントを指定する必要があります:<set-property name = "user.agent" value = "gecko、gecko1_8" />
係留

gwt 2.2ではgeckoはありません。コンパイラーは、「値geckoは以前に定義されていませんでした。要素 'set-property'の処理中に予期しない例外が発生しました」
uthark

値を "gecko1_8"に設定すると、Firefox 1.5以降の
gwt

この答えはほぼ2年前のものです。この点を明確にするために自由に編集してください。
ユヴァルアダム

6
2013年、GWTのコンパイル時間はまだ
足りません。GWT2.5の

62

-localWorkersフラグを指定してGWTコンパイラーを実行すると、コンパイラーは複数の順列を並行してコンパイルします。これにより、マルチコアマシンのすべてのコアを使用できます。たとえば、-localWorkers 2は、2つの置換を並列にコンパイルするようコンパイラーに指示します。桁違いの違いは得られません(コンパイラーのすべてが並列化できるわけではありません)が、複数の順列をコンパイルしている場合は、注目に値するスピードアップになります。

GWTのトランクバージョンを使用する場合は、任意のブラウザーでホストモードを使用でき(アウトプロセスホストモード)、ホストモードの現在の問題のほとんどを軽減できます。これはGWTが進んでいるようです-コンパイルは大幅に速くなる可能性が低いため、常にホストモードで開発してください。


2
ああ、localWorkersオプションは宝石であり、知っておく価値があります。残念ながら、ほとんどの開発ボックスはシングルコアのゼオンです。そのOOPHMも非常に有望に見えます。常に次のバージョンでは、それは...
skaffman

4
複数のコアを持つボックスでコンパイル環境を仮想化します。このvmへのリモート。-localWorkersを使用して、最小限のローカルとuser.agentsでコマンドラインGWTコンパイルを実行します。vmをホストするボックスが、展開先のネットワークピアであることを確認してください。これを組み合わせることで、tomcatへの展開でコンパイルが約30秒に短縮されます。さらに、これらはすべてスクリプトで記述できます。ローカルマシンで開発し、svnパッチを作成し、スクリプトに何らかのタイプのNFSまたはsamba共有を使用してパッチを適用させることもできます。これにより、src差分だけをコピーする必要がなくなります。わーい!
kr。

NXクライアントは、限られたADSL、ケーブル、またはWiFi接続でのリモート開発者にとっても大きな+++です。さらに、インターネットのある場所で使用しているコンプに関係なく、常に同期しています
kr。

デフォルトでは、mavenビルドでプラットフォームで利用可能なCPUの数。だから、ここではスピードアップしません。
ケイキ

55

このエントリはかなり古く、ほとんどの人はすでに知っていると思いますが、GWT 2.xには、最適化をスキップすることでコンパイルを高速化する新しいコンパイルフラグが含まれていることは、言及する価値があると思います。このようにコンパイルされたJavaScriptをデプロイすることは絶対に避けてください。ただし、非本番の継続的ビルドの時間を節約することができます。

フラグを含めるだけです:-draftCompileをGWTコンパイラー行に追加します。


3
私はそのオプションを使用しましたが、私たちのプロジェクトでは時々奇妙なエラーで失敗しました。このため、コンパイルが機能しない場合があることに注意してください。
ヴィック

31

これはuser.agent値のリストです設定できる。

(私は私はそれが唯一のクロムのための順列を生成するために設定すべきかを検索するときに、ここで終わる保つため、ここではこれを追加する答えは:。 <set-property name="user.agent" value="safari"/>


このset-property要素をどこに追加すればよいですか?app.gwt.xmlファイルの<module>要素の内外に追加しようとしましたが、機能しません。
Alex Worden、2012年

それはあなたのモジュールABC.gwt.xmlファイルに入ります。ABCはあなたのモジュール名です。
Glenn

30

GWTの新しいバージョン(2.3または2.4のどちらかで始まると思います)では、以下を追加することもできます。

<collapse-all-properties />

開発目的でgwt.xmlに追加します。これにより、GWTコンパイラーはすべてのロケールとブラウザーをカバーする単一の置換を作成するようになります。したがって、すべてのブラウザーと言語でテストできますが、コンパイルするのは単一の順列のみです。


2
興味深い...欠点は何ですか?
skaffman

すべてのブラウザーと言語を処理する単一の順列のコンパイルは、1つのブラウザーと言語のみを処理する単一の順列よりも少し時間がかかりますが、私の経験ではその違いは重要ではありません。(私が見ているもの
Chi

このドキュメントへのリンクが見つかりません...何かにリンクできますか?
skaffman

このタグはコンパイルを高速化しますが、Super Dev Mode(少なくとも2.6の場合)でのデバッグも中断します。クロムデバッガーに表示されるソースコードは、コンパイルされたjsコードとは異なります。そのため、Javaメソッドにブレークポイントを設定すると、デバッガーが別のメソッドで停止します。
damluar 14

18

本番用のビルドにオプションを1つ追加できます。

-localWorkers 8–ここで、8は順列を計算する同時スレッドの数です。あなたがしなければならないすべてはあなたにもっと便利な数にこの数を調整することです。GWTコンパイルのパフォーマンスを参照してください(Dennis Ichコメントに感謝)。

テスト環境にコンパイルする場合は、次のものも使用できます。

-draftCompile コンパイルは高速になりますが、最適化が不十分になります

-optimize 0 コードを最適化しない(9が最大最適化値)

ビルドとホストモードのパフォーマンスが2倍以上になったもう1つのことは、SSDディスクの使用でした(現在、ホストモードは魅力のように動作します)。これは安価なソリューションではありませんが、GWTの使用量と時間のコストによっては、価値がある場合があります。

これがお役に立てば幸いです!


ローカルワーカーをコアの数に設定することは、非常に非生産的です。参考のためにこれを参照してください。josephmarques.wordpress.com/2010/07/30/...
デニスのIch

デニスにコメントしてくれてありがとう。実際、私はSSDを持っており、2Gのメモリを提供しています。もちろん、順列、コア、マシンなどの数に応じて、localWorkerの数を各ケースに合わせて調整する必要があります。私の場合、ラップトップでコンパイルしているときにWebでナビゲートしたい場合2コアを空けておきます。これは単なる例です。ただし、あなたのアイデアが含まれるように私の投稿を編集します。ありがとう。
martins.tuga

14

GWTコンパイラーは多くのコード分析を行っているため、高速化は困難です。 Google IO 2008からのこのセッションは、GWTが何をしているか、なぜGWTがこんなに時間がかかるのかをよく理解できます。

私の推奨は、開発ではできるだけホストモードを使用し、テストを実行するときにのみコンパイルすることです。これは、すでに行った解決策のように聞こえますが、基本的には、ホストモードが存在する理由です(まあ、それとデバッグ)。

GWTのコンパイルを高速化できますが、GWTがデフォルトで実行する5種類ではなく、一部のブラウザーに対してのみコンパイルします。ホストモードを使用する場合は、少なくとも2つのブラウザ用にコンパイルしてください。単一のブラウザー用にコンパイルすると、ブラウザー検出コードが最適化され、ホストモードは機能しなくなります。

少数のブラウザー用にコンパイルを構成する簡単な方法は、メインモジュールから継承する2番目のモジュールを作成することです。

<module rename-to="myproject">
  <inherits name="com.mycompany.MyProject"/>
  <!-- Compile for IE and Chrome -->
  <!-- If you compile for only one browser, the browser detection javascript
       is optimised away and then Hosted Mode doesn't work -->
  <set-property name="user.agent" value="ie6,safari"/>
</module>

場合はrename-to属性が同じに設定されているあなたは、完全なコンパイルをしたかのように、出力ファイルが同じになります


11
  • アプリケーションを複数のモジュールまたはエントリポイントに分割し、必要な場合にのみ再コンパイルします。
  • コンパイルのストーリーを提供するトランクバージョンを使用して、アプリケーションを分析します。これは1.6コンパイラに関連する場合と関連しない場合がありますが、何が起こっているかを示すことができます。

GWTは常にコードに接続されているすべてのものをチェックし、モノリシックな最終結果をコンパイルするため、複数のエントリポイントは機能しますが、モジュールは機能しません。GWTフレームワークは、モジュール化の原則に対する混乱と不名誉です。GWTフレームワークを再利用した良いプロジェクトが見つかりませんでした。
user1050755

4

GWT 2.xの場合、私はあなたが

<set-property name="user.agent" value="ie6"/>
<extend-property values="ie8,gecko1_8" name="user.agent"/>

複数の順列を指定することもできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.