【问题标题】:Bad GWT Request Factory performance for list of objects对象列表的不良 GWT 请求工厂性能
【发布时间】:2014-10-09 03:39:53
【问题描述】:

我正在使用 GWT 请求工厂将对象列表传输到客户端。这些对象仅包含几个字符串,而列表仅包含 20 个对象。要传输这个小数据列表,需要一秒钟多的时间。首先,我认为查询需要优化。但测量显示:

从数据库中检索对象只需

300ms

到客户端的传输总共需要一秒钟

1136ms

所以这似乎是请求工厂开销。我已经使用了我自己的ServiceLayerDecorator 并覆盖了isLive() 函数,所以它总是返回true。我可以采取任何其他措施来加快速度并将性能提升到可接受的范围内吗?

更新:

我创建了将我的实体对象数据复制到 DTO 并使用 RPC 传输它们以比较 RPC 和请求工厂性能的逻辑。如您所见,RPC 逻辑要快得多。现在我想知道这是设计使然还是我的应用程序存在缺陷。

20个转移对象:

Request factory: 1252 ms

RPC: 420 ms

28个转移对象:

Request factory: 1654 ms

RPC: 460 ms

78个转移对象:

Request factory: 3963 ms

RPC: 769 ms

================================================ ==============

更新2

所以我编写了一个非常简单的示例应用程序,以确保我的应用程序没有任何过滤器或其他干扰组件。应用程序从服务器加载 10 个具有 4 个字符串字段的对象。我使用 Request factory 和 RPC 完成了它并停止了时间。

代码可以在这里找到: https://github.com/jan10101/requstFactoryVSRPC

这里有一个生活演示: http://requestfactorytest.appspot.com/

测试应用证实了我的观察:与 RPC 性能相比,请求工厂的性能确实很差。在开发模式下,RPC 的性能要好大约 40 倍,在生产模式下仍然是 4 倍。我是第一个注意到性能问题的人吗?

如果您不想自己尝试,以下屏幕截图显示了测试结果。

开发模式下的结果:

生产代码的结果(在应用引擎上):

【问题讨论】:

  • 20 个对象以千字节计有多大?如果您通过绕过 GWT 请求工厂的 servlet 请求相同的数据,您会得到同样缓慢的性能吗?
  • 您如何衡量转移到客户的时间?你是用浏览器测量这个吗?这是处于开发模式吗?
  • 您应该更详细地分析后端以查看它花费最多时间的位置。但是RequestFactory 使用反射(*.com/questions/12977922/…)来填充Proxys,这可能比RPC 花费更多的时间。
  • 通过覆盖 RF 和 RPC servlet 的 service(...) 方法向您的测试应用程序添加了一些计时测量代码。我的值是 RPC:服务器测量 3 毫秒,客户端测量 20 毫秒。对于 RF:服务器 65 毫秒,客户端 320 毫秒。客户端和服务器测量的值之间的差异是由于客户端的传输(可能可以忽略不计)和反序列化。所以反序列化 RPC 需要 17 毫秒,反序列化 RF 需要 240 毫秒。 (这是 FF20 中的开发模式)。
  • 我已经分叉了测试应用程序 (github.com/pillingworthz/requstFactoryVSRPC) 并添加了更多 RF 时序。在 prod 模式下,RF 服务器端以 300 毫秒启动,在 JVM 预热后(>50 个请求后),它需要 15-20 毫秒。仍然比 RPC 慢 46 毫秒,下降到 1 到 2 毫秒。客户端 RF 需要 70 毫秒来反序列化响应。还没有 RPC 反序列化的数据,但整个 RPC 请求/响应大约需要 15 毫秒。这一切都在 Firefox20 中。 Chrome 和 IE10 大约快 4 倍!

标签: java performance gwt gwt-rpc requestfactory


【解决方案1】:

我不确定这与您的具体情况有多相关,但问题可能出在 AutoBeans 上。 RequestFactory 广泛使用 AutoBeans。

我最近能够通过减少 AutoBeans 的使用来解决 GWT 应用程序中的性能问题,AutoBeans 似乎很慢。使用分层性能分析器(例如 IE 的 F12 工具中的那个)将 Autobean 代码确定为问题的根源,因此性能问题是客户端的。 IIRC 的解决方案是在调用完成后将 AutoBeans 复制到“真实”Java 对象。

【讨论】: