【问题标题】:GWT Requestfactory performance suggestionsGWT Requestfactory 性能建议
【发布时间】:2012-10-10 06:50:10
【问题描述】:

我发现使用 GWT requestfactory 时性能非常差。例如,一个请求需要我的服务层 2 秒才能完成,而 GWT 需要 20 秒来序列化。我的服务返回约 100 个 EntityProxies。每个对象都有 4 个 ValueProxies 和 2 个 EntityProxies(100 个根级 EntityProxies、400 个 ValueProxies 和 200 个额外的 EntityProxies)。但是,我在更小的数据集上看到同样的 10 倍性能下降。

日志sn-p示例:

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 上,但我不认为这在这里发挥了作用。

我发现this bug 针对 2.4 提出申请,这似乎非常相关。我已经从this google group 手动应用了补丁,没有任何运气。

我的领域模型如下所示:

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 序列化代码以尝试找出原因?

【问题讨论】:

  • 我认为您的数据结构过于复杂。试着把它弄平。你能再解释一下,你的 DTO 是什么样子的?你用 AutoBean 吗?
  • 我在问题中添加了部分领域模型。在一些更昂贵的图中,这是正在加载的图表。你有没有说数据结构太复杂的参考资料?它有什么复杂的(大小或关系)?对我来说,对于任何业务应用程序来说,这似乎都相当合理。我已经开始研究 AutoBean 并且正在考虑从服务器返回 JSON。
  • 我刚刚分析了一个加载约 10 个 EntityProxies 的请求(没有 ValueProxy 或嵌套关联)。服务层用了大约 1 秒,但 GWT 序列化只用了 3 秒多一点。

标签: gwt gwt2 requestfactory


【解决方案1】:
  • 我是否正确分析了代码并将问题隔离到 GWT 序列化?

RequestFactory 使用反射很多(例如,比 GWT-RPC 更多),所以在某些情况下它会导致一些性能问题我并不感到惊讶。 GAE 可以在这里发挥作用。
我相信 RequestFactory(实际上是 AutoBean 部分)可以极大地受益于构建时的代码生成。

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

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

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

了解反序列化请求、应用更改以及响应序列化所花费的时间也会很有趣。别忘了减去findisLive 所花费的时间。

【讨论】:

  • 我很快就会得到时间的细分。我周末大部分时间都在分析我的代码,我注意到的一件事是包含域模型作为参数的请求没有昂贵的序列化时间。例如Trip service.save(Trip t) 的序列化时间约为 100 毫秒。而Trip service.find(String id) 的序列化时间接近 12k ms。相同的图结构但不同的上下文。此外,我的 isLive 方法被删除以始终返回 true。
  • 有趣。随意在 GWT 跟踪器中打开一个新问题,其中包含您在分析应用程序时发现的内容。提前致谢!
猜你喜欢
  • 1970-01-01
  • 2011-11-29
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 2012-04-09
相关资源
最近更新 更多