9

GWT requestfactory を使用すると、パフォーマンスが非常に悪いことがわかります。たとえば、サービス レイヤーがフルフィルになるまでに 2 秒かかるリクエストは、シリアル化に GWT で 20 秒かかります。私のサービスは、EntityProxies となるものを最大 100 個返しています。これらの各オブジェクトには、4 つの ValueProxies とさらに 2 つの EntityProxies (100 のルート レベルの EntityProxies、400 の ValueProxies、および 200 の追加の EntityProxies) になるものがあります。ただし、はるかに小さいデータセットでは、同じ 10 倍のパフォーマンス低下が見られます。

ログ スニペットの例:

D 2012-10-18 22:42:39.546 ServiceLayerDecorator invoke: Inoking service layer took 2265 ms
D 2012-10-18 22:42:58.957 RequestFactoryServlet doPost: Entire request took 22870 ms

メソッドにプロファイリング コードを追加しServiceLayerDecorator#invoke、サーブレット全体をタイマーでラップしました。私はサービス自体をプロファイリングしましたが、実際には 2 秒以内に結果を返しています。

私は GWT 2.4 を使用していますが、GWT 2.5rc1 と GWT 2.5rc2 でこれをテストしました。私のバックエンドは GAE にありますが、それがここで役割を果たしているとは思いません。

このバグは 2.4 に対して報告されていることがわかりました。これは非常に関連しているようです。この Google グループから手動でパッチを適用しましたが、うまくいきませんでした。

私のドメイン モデルは次のようになります。

class Trip {
  protected Address origin; // becomes ValueProxy
  protected Address destination; becomes ValueProxy
  protected Set<TripPassenger> tripPassengers; // Set of ValueProxies
}

class TripPassenger {
  protected Passenger passenger;
}

class Passenger {
  protected Account account;
}

私の質問は:

  • コードを正しくプロファイリングし、問題を GWT シリアライゼーションに切り分けましたか?
  • この動作を引き起こす何か間違ったことをしている可能性はありますか?
  • GWT シリアライゼーション コードのプロファイリングを改善して原因を突き止めるにはどうすればよいですか?
4

1 に答える 1

1
  • コードを正しくプロファイリングし、問題を GWT シリアライゼーションに切り分けましたか?

RequestFactory は(たとえば GWT-RPC よりもはるかに多くの) リフレクションを大量に使用するため、場合によってはパフォーマンスの問題が発生することに特に驚きはありません。ここで GAE が役割を果たすことができます。
RequestFactory (実際には AutoBean 部分) は、ビルド時のコード生成から大きな恩恵を受けることができると思います。

  • この動作を引き起こす何か間違ったことをしている可能性はありますか?

ロケーターfindisLiveメソッドを確認してください。

  • GWT シリアライゼーション コードのプロファイリングを改善して原因を突き止めるにはどうすればよいですか?

リクエストの逆シリアル化、変更の適用、および応答のシリアル化に費やされた時間を知ることも興味深いでしょう。findそして、とで費やされた時間をそれらから差し引くことを忘れないでくださいisLive

于 2012-10-22T10:14:23.340 に答える