【问题标题】:Knockout performance issues with arrays having dynamic columns具有动态列的数组的淘汰赛性能问题
【发布时间】:2015-08-27 13:11:42
【问题描述】:

我正在使用 knockout.repeat 绘制具有以下数据的动态列数组:

var columns = ko.observableArray([
    new Column(1),
    new Column(2),
    new Column(3),
    new Column(4),
    new Column(5)
});

var array = ko.observableArray([1..95]);

通过敲除映射按以下方式分配数据:

mappingConfig = {
    create: function (options) {
        return new Row(options.data);
    }
};
ko.mapping.fromJS(data, mappingCOnfig, array);

通过以下方式:

<div data-bind="repeat: {foreach: array, item: '$row'}">
        <div data-bind="repeat: {foreach: column, item: '$col'}">
            <input data-bind="value: $row()[$col().Name]"/>
        </div>
    </div>

我遇到的问题是渲染 95 行 6 列需要将近 30 秒

  • 如何解决性能问题?
  • 有什么工具吗?
  • 是否有任何指导方针如何在类似的情况下最大限度地提高性能 场景?

Chrome 时间线:

更新:压力很大,所以我用reactjs重写了表格,解决了很多问题,渲染时间只有1.5秒。

【问题讨论】:

  • 你用的是什么浏览器?
  • @RoyJ 与Chrome 43.0.2357.81 m合作
  • 我记得遇到过这样的问题。对于约 1500 行数据,添加/删除行集需要几分钟时间。我不记得我做了什么来缓解它,但它认为它最终归结为你必须尽量减少创建 dom 元素所花费的时间。很多时间都花在了杀死它的 GC 上。在我的例子中,很多 dom 元素被重新创建,因为我绑定到它们的数据对象不断地从头开始重建。另外更新需要分批进行,不要单独更新。
  • @JeffMercado 附加的 Chrome 时间线 - 似乎花费最多的时间是在编写脚本而不是渲染和绘画。
  • 很遗憾,最后你不得不选择另一个框架/库来解决问题..

标签: javascript performance knockout.js knockout-mapping-plugin knockout-3.0


【解决方案1】:

您可以使用 Chrome 的开发工具对性能进行故障排除,特别是 ProfilesNetworkTimeline

请包含一个带有重现的 JSFiddle,它会更容易用于解决问题。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-03-06
  • 1970-01-01
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
  • 2016-08-21
相关资源
最近更新 更多