производительность сортировки jqgrid - PullRequest
2 голосов
/ 17 марта 2011

Я использую jqgrid на клиентской стороне для финансового веб-приложения, где строки добавляются и / или обновляются очень часто (каждые несколько мс). Максимальное количество рядов всегда остается ниже 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 выскакивает сообщение об ошибке с просьбой остановить скрипт.

Я думаю о переключении виджета сетки, но прежде я хотел бы посмотреть, есть ли у других разработчиков какие-либо идеи, которые могли бы решить эту проблему.

1 Ответ

0 голосов
/ 18 марта 2011

Во всех проблемах производительности важно локализовать узкое место.

Я полагаю, что проблема заключается в плохой производительности сортировки данных, используемой сейчас в jqGrid. Чтобы убедиться в этом, вы можете попробовать установить параметр sortname в "" и вызвать handle.trigger("reloadGrid") вместо handle.sortGrid('price', false, 'desc');

Если вы увидите, что обновление данных будет работать намного быстрее , тогда мы можем обсудить соответствующее решение. Необходимо заменить метод _doSort , используемый для сортировки локальных данных, на более эффективную версию (основанную на быстрой сортировке или, возможно, Array.sort).

Еще одна возможность повысить производительность вашего кода - это использовать data и _index параметры jqGrid для прямого доступа к внутренним данным сетки. Параметр _index поможет вам получить индекс в массиве data данных, идентифицированных rowid. После изменения всех данных вы можете запустить 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 (надеюсь, я правильно понял ваш код, а updated.id - это rowid).

Теперь вы можете вносить любые изменения в свойства элемента current без необходимости его сохранения. Ты работаешь на месте. После внесения всех изменений следует просто обновить сетку на основе измененных данных. Вы можете сделать это с помощью handle.trigger("reloadGrid") или handle.sortGrid('price', false, 'desc');, которые делают то же самое.

...