Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.11.2010, 21:38
Новичок на форуме
Отправить личное сообщение для bmziskin Посмотреть профиль Найти все сообщения от bmziskin
 
Регистрация: 23.10.2009
Сообщений: 2

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

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

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

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

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

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

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


Chrome:


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

Подскажите, пожалуйста, как можно улучшить ситуацию или хотя бы в какую сторону копать.
Ответить с цитированием
  #2 (permalink)  
Старый 22.11.2010, 22:08
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

без jQuery попробуйте
Ответить с цитированием
  #3 (permalink)  
Старый 23.11.2010, 15:00
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 03.04.2009
Сообщений: 1,263

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

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

Я бы посоветовал в этом случае делать вставку через innerHTML, без jQuery, а чтобы не появлялись висящие обработчики, использовать live-like события.
Ответить с цитированием
  #4 (permalink)  
Старый 23.11.2010, 15:11
Новичок на форуме
Отправить личное сообщение для bmziskin Посмотреть профиль Найти все сообщения от bmziskin
 
Регистрация: 23.10.2009
Сообщений: 2

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

elf, а можно подробнее, пожалуйста, по поводу вашего комментария? В каком случае появляются висящие обработчики?
Ответить с цитированием
  #5 (permalink)  
Старый 23.11.2010, 15:18
Аватар для e1f
e1f e1f вне форума
Профессор
Отправить личное сообщение для e1f Посмотреть профиль Найти все сообщения от e1f
 
Регистрация: 03.04.2009
Сообщений: 1,263

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

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему так получается? lukingnu jQuery 0 31.07.2010 15:50