сортировка JavaScript повисает - PullRequest
1 голос
/ 07 сентября 2010

Я рендерил около 3000 записей,

Я использую этот скрипт с открытым исходным кодом сортировки,

Когда я нажимаю на столбец, мой браузер очень скоро зависает,

я не могу продолжить,

Есть ли решение для этой проблемы.

текст ссылки

Ответы [ 3 ]

3 голосов
/ 07 сентября 2010

Обновление 2

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

Обновление

Я больше не думаю, что между браузерами существует большое расхождение в том, что касается встроенной функции sort (). Хотя IE8, например, намного медленнее, чем, скажем, Chrome, я не думаю, что это связано только с функцией сортировки. Я сделал некоторые профилирования в IE8, используя некоторые случайные данные. Я обнаружил, что оригинальный код может быть существенно улучшен, когда данные столбца числовые или дата. Включение поисков регулярных выражений в функции сравнения для этих типов данных значительно замедляет процесс, потому что они выполняются каждый раз, когда выполняется сравнение между элементами, для которых для 3000 элементов это около 60 000 сравнений. Число регулярных выражений в два раза больше. Делая все это до начала сортировки, мы выполняем 3000 регулярных выражений, а не 120 000. Это может быть около 50% экономии времени. Я внесу свои изменения в сортируемый код чуть позже.

Кроме этого, большую часть времени переупорядочивает элементы DOM, а не сортирует (если вы не используете сортировку шейкера). Если вы можете найти более быстрый способ сделать это, вы можете сэкономить там время, но я не знаю, как это сделать.

Оригинальный ответ:

Возможно, проблема здесь связана с фактической сортировкой. Если вы откомментировали часть кода там (и закомментировали какой-то другой код), то ваш код использует сортировку шейкером для получения стабильной сортировки. Сортировка шейкеров по существу является двунаправленной пузырьковой сортировкой. Пузырьковые сортировки очень медленные, O (N ^ 2). Если вы не раскомментировали этот код, он использует встроенную функцию javascript sort () с различными функциями компаратора. Проблема в том, что функция sort () реализована по-разному в разных браузерах , поэтому вы можете захотеть увидеть, возникает ли эта проблема в некоторых браузерах, а не в других. По-видимому, в коде Webkit все еще используется выбор, или min, сортировка, которая равна O (N ^ 2). Это почти заставляет меня хотеть плакать. Какой браузер вы использовали для проверки этого?

Если проблема с функцией сортировки оказывается проблемой, то вы можете попробовать изменить приведенный выше код, чтобы подать в суд на сортировку слиянием или быструю сортировку, которые оба являются O (N log N). Быстрые сортировки немного сложнее, чтобы избежать случаев O (N ^ 2), поэтому вы можете использовать сортировку слиянием. Кроме того, сортировка слиянием является стабильной сортировкой. На этой странице приведен пример начала сортировки слиянием.

0 голосов
/ 07 сентября 2010

Эта библиотека, кажется, использует манипуляции DOM для сортировки.

Было бы лучше каждый раз генерировать таблицу и вставлять ее, используя innerHTML.В современных движках javascript это выглядит мгновенно.

Даже IE6 хорош в этом.

При этом ... показывать человеку 3000 строк - это сомнительно.Но это еще одна дискуссия;)

0 голосов
/ 07 сентября 2010

Вы ответили на свой вопрос в некотором роде.

Посмотрите на скрипт сортировки.

Сортировка 3000 записей, реорганизация DOM и рендеринг вывода.

Это наверняка займет время.

Этот скрипт, который вы используете, предназначен для небольших наборов записей.

Предложение : Использование сортировки на стороне сервераи представить результаты в страницах, каждая страница содержит, скажем, 50 записей.Для примерно 3000 записей у вас будет около 60 страниц.

Допустим, вы находитесь на 45-й странице.Затем вы запускаете SQL-запрос для сортировки (asc / desc) и пропускаете первые 44 * 50 записей и извлекаете следующие 50 записей (для 45-й страницы).

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