Дополнения

Рекомендации по повышению производительности расширений

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

Увеличиваем скорость запуска

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

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

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

Используйте модули JavaScript

Вы можете создать собственный модуль JavaScript, объединив набор функций, которые нужны только в определенных ситуациях. Это упростит загрузку блоков кода вашего расширения на лету, вместо загрузки всего сразу.

Несмотря на то, что модули JavaScript могут быть чрезвычайно полезны и давать прирост производительности, они должны применяться разумно. Загрузка модулей все же несет небольшие затраты, поэтому разбивка кода на ненужные уровни может привести к негативным результатам. Код должен быть разбит на модули так, чтобы от этого улучшалась его понятность, а загрузка крупных или требующих больших затрат блоков кода могла быть значительно отсрочена.

Отсрочивайте все, что возможно

У большинства расширений есть обработчик события загрузки в главном оверлее, который выполняет функцию при запуске браузера. Выполняйте в этой функции как можно меньше кода. Окно браузера зависает до тех пор, пока обработчик загрузки вашего плагина полностью не выполнится, поэтому чем больше в нем осуществляется действий, тем медленнее Firefox кажется пользователю.

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

Общие вопросы производительности

Избегайте утечек памяти

Утечки памяти вынуждают сборщик мусора и сборщик циклических ссылок (cycle collector) выполнять больший объем работы, а это в значительной мере сказывается на быстродействии.

Зомби-ячейки (zombie compartments) - это особый вид утечки памяти, который можно легко выявить. Загляните на страницу Зомби-ячейки, особенно раздел Проактивная проверка плагинов.

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

Помимо поиска различных видов утечек памяти, стоит также проверить функционал вашего расширения и содержимое вкладки about:memory на предмет избыточного потребления памяти. Например, ошибка 719601 приводила к тому, что ячейка JavaScript содержала сотни мегабайт памяти, что гораздо больше, чем обычно.

Избегайте написания медленных таблиц стилей CSS

  • Прочитайте руководство "Разработка эффективных таблиц стилей CSS".
  • Помните, что каждый селектор в вашем правиле, который может совпадать с множеством различных узлов - это источник снижения производительности при поиске совпадения или выполнении динамического обновления элемента. Это особенно плохо, если селектор может динамически запускать и останавливать поиск совпадений. Остерегайтесь использования псевдо-класса ":hover".

Избегайте использования технологии DOM Mutation Events

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

Используйте методы ленивой загрузки

JavaScript-модуль XPCOMUtils предоставляет два метрода ленивой (отложенной) загрузки:

  • defineLazyGetter() определяет для указанного объекта функцию, которая действует как метод доступа get, возвращающий объект, который будет создан в момент первого обращения к нему. Подробнее см. примеры.
  • defineLazyServiceGetter() определяет для указанного объекта функцию, которая действует как метод доступа get для сервиса. Сервис не будет получен до первого его использования. Например, Look through the source.

Множество распространенных сервисов уже закэшированы для вас в модуле Services.jsm.

Используйте ассинхронный ввод/вывод

Это следует подчеркнуть: никогда не выполняйте синхронный ввод/вывод в главном потоке.

Любой ввод/вывод в главном потоке, будь то активность жесткого диска или сетевая активность, может стать причиной серьезных проблем с временем отклика интерфейса пользователя.

  • Никогда не используйте синхронные запросы XMLHttpRequests.
  • Используйте модуль NetUtils.jsm, который предоставляет возможность асинхронного чтения и копирования файлов.
  • Никогда не работайте с базами данных SQLite синхронно. Вместо этого используйте асинхронный API.
  • Выполняясь одна за другой, асинхронные операции зачастую можно значительно упростить, используя объект Promises.

Избегайте событий перемещения мыши

Избегайте использования обработчиков событий мыши, включая такие события, как mouseover, mouseout, mouseenter, mouseexit, и особенно mousemove. Они возникают довольно часто, поэтому их обработчики способны в значительной мере повысить нагрузку на процессор.

Когда без них обойтись не получается, во время обработки события должен выполняться минимум вычислений, а существенная работа приостановлена. Обработчики должны добавляться к наиболее вероятному элементу, и удаляться, если непосредственно не требуются в данный момент.

Избегайте анимированных изображений

Анимированные изображения значительно более ресурсозатратны, чем считалось ранее, особенно когда используются в элементах tree.

Рассмотрите возможность применения Chrome Workers

Вы можете использовать ChromeWorker для выполнения длительных задач или обработки данных.

Смотрите также

Метки документа и участники

 Внесли вклад в эту страницу: helperman
 Обновлялась последний раз: helperman,