我正在GWT项目中,我们正在使用FlexTable显示一些数据。我知道我们应该使用CellTable,因为它具有更好的性能,但是FlexTable的样式(样式特定的单元格)更容易设置,并且更容易更新特定的单元格。

为了接收该表的更新,我们使用WebSockets。我们现在面临的问题是当WebSocket每秒每秒进行100多个更新时,CPU负载很高。来自WebSocket连接的每个消息都包含表中几个单元格的更新。因此,在实践中,每秒应在FlexTable中呈现100多个更新。我的具有4GB RAM的3GHz i5上的CPU负载约为50%。如果我禁用数据的实际呈现(注释掉setText()方法调用),那么CPU负载将下降到5-10%。因此,我知道DOM更新是瓶颈,而不是代码的其他部分。

会更好吗

  • 使用网格代替
  • 切换到CellTable(但是如何使单个单元格更新)?
  • 使用JS/JSNI处理DOM而不是FlexTable setText()

  • 有更好的方法来实现表格并提高性能吗?

    如果有人在FlexTable中遇到类似的问题,我曾尝试在Google上进行搜索,但仅发现一般的看法,即它运行缓慢,没有具体说明。我们仅使用JavaScript完成了应用程序原型(prototype),并且每秒进行100次更新,CPU负载约为15%

    更新
    降低css淡入淡出效果(我们用来指示单元值的变化)可将CPU负载减少约10%。因此,似乎DOM并不是唯一的问题。

    最佳答案

    使用CellTable,您必须重新渲染整个表以更新单个单元格。但是,这样的更新将是对DOM的单个更新。使用FlexTable,即使将所有更新一起批处理,您也将进行大量单独的DOM操作。因此,即使由于重复更新某些单元格而使用CellTable似乎效率低下,但仍然值得进行切换。尤其是在您要更新接近于单元总数的单元数量的情况下:一起批处理100次更新,并一次完成一次DOM写操作就可以一次完成所有更新。

    我有一个带有CellTable的应用,该应用可以大至30x100。它在任意单元格上具有任意样式,每个单元格都有复杂的内容(一个<img>,一些<div>和一些文本),有时我需要更新一个单元格。在我的Macbook Pro上,在开发模式下,重绘整个内容在我的人类感知中是不明显的。

    如果您要实时更新(例如每秒进行100次更新),那么我认为您可能希望使用其他平台。甚至您的监视器每秒也不刷新100次。

    关于GWT FlexTable的性能和优化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8065304/

    10-10 06:09