事实证明,问题更多在于客户端的 JavaScript 引擎,而不是我正在使用的数据。我一天中的大部分时间都在对流程进行基准测试并为各种操作计时。
一切都在 Chrome 中快速运行。在 Firefox 中,一切都运行得非常快(认为不如 Chrome 快)。真正的性能落后者是 Internet Explorer。
当我加载整个数据集(所有 200 行)时,Flexigrid 会尝试对表中的每个单元格进行一些后处理。正如您在屏幕截图中看到的,每行有 29 个单元格......所以我们正在查看一堆格式化操作,总共 5800 次。
我能够将一些更昂贵的操作(即创建 jQuery 对象)从较低级别的单元循环中提取出来,因此它们每行只运行一次,但最终我仍然遇到与 IE 相关的性能问题。
为了给你一些真实世界的基准,我将代码设置为在它遇到某些事件之前吐出总时间:
populate当浏览器第一次发送 XHR 请求时触发
addData在请求返回后且在解析 JSON 对象之前触发
addCellProp在初始解析数据后触发并遍历表中的每个单元格
done当一切都完成时触发
处理 20 行数据(默认):
------------------------------------------------------
| browser | populate | addData | addCellProp | done |
------------------------------------------------------
| Chrome | 0 | 84 | 123 | 286 |
| IE9 | 0 | 151 | 309 | 799 |
| IE8 | 0 | 226 | 481 | 1105 |
处理完整的数据集(本机 179 行):
------------------------------------------------------
| browser | populate | addData | addCellProp | done |
------------------------------------------------------
| Chrome | 0 | 318 | 669 | 1963 |
| IE9 | 0 | 157 | 1813 | 9428 |
| IE8 | 0 | 229 | 2188 | 13335 |
最昂贵的操作是 betweenaddCellProp和done。我已经完成并尽可能地提高了代码的效率,但是当您运行数据集的多次迭代时,您可以做的只有这么多,尤其是在操作 DOM 时。
我已经修改了 Flexigrid(尽管有很多建议不要这样做)以尽可能少地接触 DOM,这实际上加快了速度。当我开始这项研究时,IE9 需要 20 到 30 秒才能触发done事件。
不幸的事实是,并非所有平台都是平等的,IE 似乎并不是以这种方式在显示中处理数据的最佳引擎。
更好的方法可能是在服务器端创建和操作 HTML 表,并在 IE 用户请求时将整个内容(标记和所有内容)发送到浏览器,而不是依赖 IE 从原始 JSON 对象创建标记。