4

我想要了解我为 GWT 进行的 DOM 操作所付出的性能代价。我想知道哪些操作是“昂贵的”,哪些不是,以及如何衡量它。我想知道如何分析这些操作,或者根本不值得关注这个问题。

更准确地说,这是我遇到的用例列表。

1)用例#1:如果发生某些事件,您有一个小部件会改变其外观。如果我要删除旧的小部件并创建一个新的小部件,或者更改现有小部件的样式会更好吗?换句话说,在 GWT 应用程序中创建和插入新小部件的价格是多少?是否有任何类型的垃圾收集器用于删除的 DOM 元素?

2)用例#2:您需要从/在服务器端获取或保存一些数据。数据可能非常大。创建一个特殊的 Servlet 以非常简化的方式进行此操作是否有任何意义:只接受或打印一些字符串而不是对标准 GWT servlet 进行 RPC 调用?这是提高性能的好方法吗?您自己编写的 Servlet 可以非常简单。

3)用例#3:你有一个小部件,它是一长串其他小部件。您如何估计哪些数量的小部件可以安全地显示客户端性能?我的意思是,如果我们在过去 5 年中显示 500 万条聊天消息,即使我们将部分加载项目,客户端可能会变慢,从而限制服务器端的压力。

4)用例#4:dom操作的性能价格如何,例如找出某个容器内的元素数量,或者找出元素的样式?例如,您需要计算聊天中的消息数量。这种计算聊天容器的 DOM 子节点的操作是否非常昂贵,以至于最好实现单独的计数器并在新消息到达时增加它(就像 Java 集合一样)?

4

1 回答 1

5

Use case #1: Updating style is always recommended rather than remove/add widget. 更新样式意味着 CSS 解析/重新计算/绘画。删除/添加小部件将导致 DOM 和 CSS 解析/重新计算/绘制。

Use Case #2:这真的取决于你的操作。GWT 带有三种服务器端通信方式。它们中的每一个都适用于不同的用例 -在这里阅读。

a) RPC - Remote Procedure calls
b) RF - Request Factory & Entities
c) Request Builder with self-written Servlet serving up Strings,JSON or Autobean.

Use Case #3:您拥有GWT Cell Widgets以使用最少的 DOM 操作来显示大数据。如果显示聊天消息是一项要求,请在滚动时尝试使用 AutoPager 的 CellList,并且可能会在异步 DataProvider 中抛出。

Use case #4:您应该使用 Java Pojo 支持的 Cell Widgets。每条聊天消息都是 Java Pojo“ChatMessage”的一个实例,并且根据您的 RPC 调用,您获取一个 List 并将其提供给 CellList/CellTable 。当您可以仅通过对 List 的 sizeOf 操作来计算“数据”时,为什么还要计算 dom。

你在错误的方向上思考你的项目。如果您的编程方法错误,则 DOM 操作是一个问题。通过下载GWT 文件浏览 GWT 示例并通过导入到 eclipse 来执行它们。

性能调优是 GWT 的最强特性。如果有足够的经验,您可以使用 GWT 调出任何性能问题SpeedTracer, Logging, Chrome Dev tools Profiling, GWT Light Weight Metrics, Code Splitting, GWT Compiler Metrics, GWT Closure Compiler, Resource Bundling and the list goes on....

于 2013-02-14T14:27:38.810 回答