Производительность функции сортировки jQuery - PullRequest
0 голосов
/ 07 октября 2009

Я сортирую список

элементов. Я адаптировал функцию на странице, на которую сейчас не могу ссылаться. Вы можете увидеть живой сайт здесь . Нажмите «Сортировка и фильтрация» и выберите любой из методов сортировки (английское имя, материал, статус ...). Все виды по сути одинаковы, поэтому процессорное время одинаковое.

Моя функция jQuery выглядит так:

jQuery.fn.sort = function() {
    return this.pushStack([].sort.apply(this, arguments), []);
};
  function sortAscending1(a, b)  { return $(a).find(".english").text() > $(b).find(".english").text() ? 1 : -1; };  
  function sortDescending1(a, b)  { return $(a).find(".english").text() < $(b).find(".english").text() ? 1 : -1; };

И я звоню из следующей строки jQuery (s_alf_eng - это интерактивный div на странице).

$(document).ready(function() {
    $(".s_alf_eng").toggle(
        function() {
            $('.media-status-specie li').sort(sortAscending1).appendTo('.media-status-
        },
        function() {
            $('.media-status-specie li').sort(sortDescending1).appendTo('.media-status-specie');
        }); 

Я могу дать любые дополнительные разъяснения быстро. Спасибо!

EDIT: Вопрос заключается в том, что выполнение этого вида для большого списка занимает несколько секунд. В моем core2duo это может занять до 20 секунд! Я изменил поиск (". English") на фильтр (". English"), и скорость, кажется, такая же. Любая идея о том, как ускорить это?

Ответы [ 2 ]

2 голосов
/ 07 октября 2009

Сделайте копию в памяти списка и отсортируйте ее, затем замените существующий список отсортированным. Это было бы быстрее, чем манипулирование живыми, видимыми элементами DOM.

1 голос
/ 07 октября 2009

Я думаю, что если вы добавите имя в качестве метаданных к узлу и исключите просмотр DOM при каждом сравнении, это будет намного быстрее. Помните, что в конце концов их O (n 2 ).

$(function() { 
    $('.media-status-specie li')
        .each(function () {
            $(this).data('name', $(this).find(".english").text());
        })
});

.... 

function sortDescending1(a, b)  { 
    return $(a).data('name') < $(b).data('name') ? 1 : -1; 
}

Отказ от ответственности: Это мое мнение, я не умею угадывать медленные точки, как любой другой разработчик, используйте профилировщик для поиска реального убийцы производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...