С недавним обновлением RLib был оптимизирован поиск служебных классов "rload_controllers" во всех элементах страницы.
Приведу немножко статистики и результаты профилирования.
Чуть раньше поиск спец. классов "rload_controllers" выполнялось через проход по словарю известных rload_классов и поиском совпадений в DOM-е через jQuery('.rload_somecontroller') для каждого элемента словаря. Десятки раз вызывалась функция-обертка jQuery() и десятки тысяч jQuery.hasClass().
По результатам профилирования в Firebug на главной странице боевой rutube.ru, среднее число вызовов всех функций на сайте составляло 120-130 тыс. и среднее время выполнения скриптов 1.1-1.2 секунды.
После рефакторинга RLib в части метода dynamicLoad (в котором производится основная часть проходов по DOM), цикл проходов по словарю был заменен одни проходом по DOM посредством метода document.getElementsByTagName('*') и сравнением классов каждого элемента с элементами rload-словаря.
По результатам профилирования в бою, число вызовов функций составило 60-70 тыс.и время выполнения 470-550 мс.
Таким образом:
- суммарное число вызовов функции hasClass() сейчас 20-40 тыс вызовов, время работы 30-60мс;
- суммарное время функции dynamicLoad = 70-80мс.
У меня появилась идейка как можно еще больше оптимизировать это достаточно узкое место.
Например, если вынести спец. метки контроллеров в верстке (rload_controllers) из атрибута class в специальный атрибут например data-rload, тогда можно будет в одном проходе по всем элементам сразу ловить метки для подгрузки контроллеров, и избавиться от вызовов достаточно медленной функции hasClass в этом критичном месте.
Так как doctype документа XHTML, это не противоречит стандарту.
Плюсы:
1) избавляемся от вызовов hasClass и выигрывает 20-40 тысяч вызовов, и соответственно время загрузки.
2) перестаем быть сильно чувствительны к разрастанию DOM, т.к. сейчас чем больше элементов на странице, тем больше вызовов достаточно медленной hasClass()
Я подготовил тест производительности, который подтверждает что реализация с getAttribute() почти в 20 раз быстрее hasClass() который реализован у нас сейчас: http://jsperf.com/getattrvshasclass
Чем грозит:
1) переделка всех шаблонов, где подключение контроллеров выполняется в атрибутах class="" и страшный мердж в svn :)
2) соглашение в дальнейшем подключать js-контроллеры через атрибут data-rload
Скорее всего выигрыш составит не больше 80-100 мс, но так по крупицам сможем суммарно увеличить время загрузки.
Коллеги, интересно ваше мнение по этому поводу.
Комментариев нет:
Отправить комментарий