我正在使用GWT项目,我们正在使用FlexTable来显示一些数据。我知道我们可能应该使用CellTable,因为它具有更好的性能,但FlexTable更易于样式化(样式特定的单元格),并且更容易更新特定的单元格。GWT FlexTable性能和优化
要接收我们使用WebSockets的表的更新。我们现在面临的问题是当每秒通过WebSocket发送超过100次更新时,CPU负载过高。来自WebSocket连接的每条消息都包含表中几个单元格的更新。因此,实际上每秒钟应该在FlexTable中呈现超过100次更新。我的3GHz i5和4GB RAM的CPU负载约为50%。如果我禁用数据的实际渲染(注释掉setText()方法调用),那么CPU负载降至5-10%。所以我知道DOM更新是瓶颈,而不是代码的其他部分。
它会更好,以
- 使用网格而不是
- 开关CellTable(但如何让燎细胞更新即可)?
- 使用JS/JSNI与DOM的,而不是FlexTable的setText()工作
是否有实现表并提高性能更好的方法?
我试过谷歌,如果有人有与FlexTable类似的问题,但只发现一般意见,它只是缓慢,没有具体。我们有应用原型在JavaScript中,每秒钟CPU负载相同的100个更新纯粹做的是在15%左右
更新
删除我们用于指示在单元格的值降低CPU负荷变化的CSS淡入淡出效果〜10 %。所以看起来DOM并不是唯一的问题。
单元的实际更新是在SchedulerImpl.get()。scheduleDeferred()中完成的,但这并没有多大帮助。尽管它让浏览器更具响应能力。使用SchedulerImpl.get()。scheduleIncremental()不会工作,因为我们得到的数据量可能会有所不同。到目前为止,看起来我们应该尝试使用Grid或自己实现Table。 – dimchez
在这种情况下,递增是远远好于延迟的。延迟将对每个操作使用新的js计时器,而增量会将多个更新批量处理到单个js执行堆栈中,从而导致单个页面重绘,从而允许渲染线程也批量执行操作。 – Ajax