web-dev-qa-db-ja.com

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

私たちはプロジェクトでGWTをより重く使用し始めており、GWTコンパイラのパフォーマンスはますます迷惑になっています。

ホストモードブラウザーに重点を置くなど、問題を軽減するために作業慣行の変更を開始します。これにより、GWTコンパイラーを後で実行する必要がなくなりますが、それ自体のリスク、特に実際のブラウザで問題が発生するのは、私たちが望むよりはるかに遅くなるまでです。

理想的には、GWTコンパイラ自体をより速くしたいと考えています-かなり小さなアプリケーションをコンパイルするのに少し時間がかかります。ただし、かなり単純な方法であればコンパイルを使用しているので、すばやく簡単に利益を得られることを望んでいます。

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

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

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

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

200
skaffman

不快な真実から始めましょう: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がデフォルトのロケールを使用するようにそれらをすべてコメントアウトできます。これにより、コンパイル時の追加オーバーヘッドが削減されます。

結論:コンパイラーのパフォーマンスは桁違いに向上するわけではありませんが、いくつかの緩和を行って、あちこちで数分を削ることができます。

143
Yuval Adam

-localWorkersフラグを指定してGWTコンパイラーを実行すると、コンパイラーは複数の順列を並列にコンパイルします。これにより、マルチコアマシンのすべてのコアを使用できます。たとえば、-localWorkers 2は、2つの順列を並行してコンパイルするようコンパイラーに指示します。大きさの違いは得られません(コンパイラーのすべてが並列化できるわけではありません)が、複数の順列をコンパイルしている場合、それでもかなりの高速化です。

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

62
Chi

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

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

55
monzonj

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

(これを追加するのは、クロムの順列のみを生成するように設定する必要があるものを検索するときにここに行き着くためです。答えは<set-property name="user.agent" value="safari"/>

30
Stephen

GWTの新しいバージョン(2.3または2.4のいずれかを開始、私は信じています)では、追加することもできます

<collapse-all-properties />

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

30
Chi

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

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

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

-draftCompileは、より高速ですが最適化されていないコンパイルを可能にします

-optimize 0はコードを最適化しません(9が最適化の最大値です)

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

これがあなたを助けることを願っています!

16
martins.tuga

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属性が同じに設定されている場合、出力ファイルは完全コンパイルを実行した場合と同じになります

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

コンパイルの順列を制御すると便利です。詳細については、次のリンクを参照してください。

順列爆発の制御:条件プロパティ

順列爆発の制御:SoftPermutations

5
milind_db

GWT 2.xの場合、使用する場合

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

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

4
CCarpo