9

使用 GWT requestfactory 时,我发现性能非常差。例如,一个请求需要我的服务层 2 秒才能完成,而 GWT 需要 20 秒来序列化。我的服务返回约 100 个 EntityProxies。每个对象都有 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方法中添加了一些分析代码,并将整个 servlet 包装在一个计时器中。我已经对服务本身进行了分析,它确实在~2s 内返回了结果。

我正在使用 GWT 2.4,但在 GWT 2.5rc1 和 GWT 2.5rc2 上对此进行了测试。我的后端在 GAE 上,但我不认为这在这里发挥了作用。

我发现这个错误是针对 2.4 提交的,这似乎非常相关。我已经手动应用了这个谷歌组的补丁,没有任何运气。

我的域模型如下所示:

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 部分)可以极大地受益于构建时的代码生成。

  • 我做错了什么会导致这种行为吗?

检查您的定位器find和/或isLive方法。

  • 如何更好地分析 GWT 序列化代码以尝试找出原因?

了解反序列化请求、应用更改以及响应序列化所花费的时间也会很有趣。并且不要忘记减去花费在find和中的时间isLive

于 2012-10-22T10:14:23.340 回答