【问题标题】:jqgrid sorting performancejqgrid排序性能
【发布时间】:2011-03-17 20:14:49
【问题描述】:

我在客户端上将 jqgrid 用于金融 Web 应用程序,其中行会非常频繁地添加和/或更新(每隔几毫秒)。 最大行数始终保持在 80 以下。 数据通过彗星推送到网络(反向ajax) 当数据进来时,应用以下代码

更新 jqgrid 是这样定义的:

jQuery(selector).jqGrid(
                {
                    datatype: 'local',
                    localReader: {
                        id: "id" 

                    },
                    colNames: ["id","price","volume","time"],
                    colModel: [ {name:'id', width:60},
                                {name:'price', width:80,
                                       align:"right",sorttype:"float"},
                                {name:'volume', width:100},
                                {name:'time',index:'amount', width:80} 
                                ], 
                    sortname: '', 
                    sortorder: 'desc',
                    height:'100%',
                    rowNum: 80,
                    viewrecords: true,
                    loadonce: true

                });

        ........................

_updateGrid: function (handle, args) { 
    var updated = args.data;
    var current = handle.jqGrid('getRowData', updated.id);
    if (typeof current.id == 'undefined' || current.id == null
                                         || current.id == "") {
        current = updated;
        var itWorks = handle.addRowData(updated.id, current);
    }
    else {
        handle.jqGrid('setRowData', updated.id,
                      {
                          id: updated.id
                          , price: updated.price
                          , volume: updated.volume
                          , time: updated.time
                      });
    }

    handle.sortGrid('price', false, 'desc');
}

现在性能非常糟糕,以至于firefox弹出一条错误消息要求停止脚本。

我正在考虑切换网格小部件,但在此之前我想看看其他开发人员是否有任何可以解决问题的想法。

【问题讨论】:

    标签: javascript performance sorting jqgrid client-side


    【解决方案1】:

    在所有性能问题中,定位瓶颈很重要。

    我想问题是现在 jqGrid 中使用的数据排序性能不佳。要验证这一点,您可以尝试将 sortname 参数设置为 "" 并调用 handle.trigger("reloadGrid") 而不是 handle.sortGrid('price', false, 'desc');

    如果您发现刷新数据会更快,那么我们可以讨论相应的解决方案。需要将用于对本地数据进行排序的_doSort 方法替换为更有效的版本(基于快速排序或可能的 Array.sort)。

    另一种提高代码性能的方法是使用 jqGrid 的 data_index 参数来直接访问内部网格数据。 _index 参数帮助您获取由rowid 标识的数据data 数组中的索引。修改完所有数据后可以触发reloadGrid刷新网格。

    更新:附上代码

    var lastData = handle.jqGrid('getGridParam','data');
    var dataIndex = handle.jqGrid('getGridParam','_index');
    

    可以获取保存在网格中的本地数据及其索引。与

    var i = dataIndex[updated.id], var current = null;
    if (i>0) { current = lastData[i]; }
    

    您通过 rowid updated.id 获得数据元素的reference(希望我理解您的代码正确,并且 updated.id 是 rowid)。

    现在您可以对current 元素的属性进行任何修改,而无需保存它。你就地工作。完成所有修改后,应根据修改后的数据刷新包含的网格。您可以使用 handle.trigger("reloadGrid")handle.sortGrid('price', false, 'desc'); 来执行此操作,它们的效果相同。

    【讨论】:

    • 我试过 handle.trigger("reloadGrid"),但没有运气。仍然表现不佳。您能否详细说明如何使用 data_index 参数。谢谢。
    • @Alpha:我更新了我的答案。您确定使用不使用handle.sortGrid('price', false, 'desc'); 并且只使用了handle.trigger("reloadGrid") 并且您一直使用sortname:""?只有sortname:"" jqGrid 不会对数据进行排序。
    • @Oleg。你是对的,当不涉及排序时,性能还可以。
    • @Oleg,关于我的代码:数据是易变的,它们会显示出来,如果更新它们就消失了,什么也没有保存。数据逐行出现。因此,当一行“到达”时,我首先检查它是现有行还是新行。如果是新的,它会被添加,如果不是,它会被更新。然后对网格进行适当的排序。我看不出 data_index 在这种情况下如何帮助我
    • @Alpha:嗯。现在可能会更加困难。首先80行数据并不多。您可以尝试回发所有 80 行,但正确排序,然后填充所有数据。您可以使用GridUnload 删除当前网格(参见here 示例)。我建议将其作为第一个选项,因为在数据库中或在本机代码中使用快速排序进行排序可以像在 JavaScript 中一样快速排序。如果不可能,您可以尝试根据您可以轻松找到的代码示例重新实现您自己的排序。我可以帮你处理 jqGrid
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多