Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Профайлинг. jquery.clean() и jquery.after() - почему так долго? (https://javascript.ru/forum/jquery/13254-profajjling-jquery-clean-i-jquery-after-pochemu-tak-dolgo.html)

bmziskin 22.11.2010 21:38

Профайлинг. jquery.clean() и jquery.after() - почему так долго?
 
Всем доброго.

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

У меня есть массив из большого количества данных, на основе которого я генерю таблицу. Генерю "более или менее по умному":

var html;
html += '...' для каждой строки,
потом оборачиваю всё это в один элемент
и делаю $().append(html);

Но когда строк много, то всё равно на слабых машинах наблюдаются проблемы. Начал делать профайлинг.

Многого не понял :)

Вот что показывают профайлеры:
Firebug:


Chrome:


То, что показывает хромовский профайлер, мягко говоря, не очень информативно.
По профайлеру FB.
Три функции (?)() - это функции, которые в цикле обрабатывают элементы массива. К ним претензий нет.
А вот функции after() и clean() (нативные функции jQuery) отрабатывают по одному разу, но работают дохрена долго.

Подскажите, пожалуйста, как можно улучшить ситуацию или хотя бы в какую сторону копать.

monolithed 22.11.2010 22:08

без jQuery попробуйте

e1f 23.11.2010 15:00

А можно более развернутый пример проблемного кода?
Скорее всего, вы генерируете таблицу целиком, а кусок. jQuery вроде бы обрабатывает по-разному, из-за IE.

+ очень много времени занимает вызов clean - это снятие обработчиков.

Я бы посоветовал в этом случае делать вставку через innerHTML, без jQuery, а чтобы не появлялись висящие обработчики, использовать live-like события.

bmziskin 23.11.2010 15:11

Я генерирую таблицу целиком от <table> до </table> в обычном текстовом формате конкатенацией строк в цикле. Даже показывать нечего :)
Сегодня попробую вставлять без jQuery. Такая очевидная мысль не пришла мне в голову :)
Спасибо.

elf, а можно подробнее, пожалуйста, по поводу вашего комментария? В каком случае появляются висящие обработчики?

e1f 23.11.2010 15:18

Например, вы навешивате event listeners на строки или ячецки таблицы. jQuery складывает их во внутренний хэш. При удалении элементов их нужно убирать, поэтому движок проходится по всем внутренонстям таблицы, ищет обработчики, находит -- удаляет. Это долго.

Поэтому, если необходимы обработчики для действий с таблицей, правильнее навесить один обработчик на саму таблицу, а в нем уже разбирать, что делать. Проще, быстрее, удобно снимать. Называется event delegation


Часовой пояс GMT +3, время: 04:56.