Здесь мы представляем подробный анализ производительности некоторых из самых популярных двигателей блокатора контента: Ublock Origin , Adblock Plus , Храбрый , Duckduckgo и Cliqz/isostery’s Advanced Adblocker (поставляется с призыва 8), который мы будем ссылаться на Азота для остальной части статьи.
Это исследование было мотивировано недавним Манифест V3 споры . Одним из предложенных изменений включает в себя добивание API в WebRequest для ограничения их блокирующих способностей. Две оправдания были выпущены: один связан с Производительность И другой, связанный с конфиденциальностью. Аргумент конфиденциальности заслуживает своего собственного отдельного анализа и не будет покрываться здесь. В этом исследовании мы показываем, что Производительность Аргумент не держит. Наше сравнение демонстрирует, что самые популярные контент-блокаторы уже очень эффективны (имея много миллисекунды среднего периода решения на запрос) и не должен привести к тем, как пользователи не должны приводить к ним. Мы показали в другом исследовании Налог трекера Эта блокировка рекламы и трекеров на самом деле уменьшает время загрузки веб-сайтов по до 2-фактора Отказ Кроме того, эффективность постоянно улучшается, и такие технологии, как WebAssembly, позволит едваться еще дальше.
Это сравнение не требует полных расширений, а вместо этого Фокусируется на сетевом запросе, блокирующих двигатели , что является наиболее интенсивной задачей CPU, выполняемая контентами-блокаторами (в частности, это не учитывает косметические двигатели или управление подписки). Вот домашние страницы для всех блокаторов контента:
Мы не включали родные блокировщики из проектов Chromium и Safari, поскольку это потребует некоторых значительных усилий, чтобы упаковать их таким образом, чтобы обеспечить сравнительный анализ против других библиотек. Мы оставляем это для будущей работы.
Все блокировщики кроме Ublock Origin доступны в виде библиотек JavaScript, которые могут быть загружены в Node.js. Разрешить сравнение Ublock Origin Кроме того, мы должны были извлечь статический сетевой фильтр-сигнал от продления . Версия Ublock Origin работает в этом эталоном не использует webassembly Версия сопоставления домена.
Все тесты проводились на углероде 2016 года в X1 (I7 U6600 + 16 ГБ) в Node.js 11.9.0. Измерения памяти были выполнены в Google Chrome Version 72.0.3626.96, используя инструмент Snapshot Memory.
Результаты
Перед представлением подробного анализа результатов давайте выделим наши выводы в двух словах:
- Все блокировщики контента, кроме Duckduckgo есть Субмиллисекундное среднее время принятия решения за запрос.
Время обработать запрос в прихове (Средний): 0,007 мс
- 2.7x быстрее, чем УБРОК
- 2.9x быстрее, чем Adblock Plus
- 6.3x быстрее, чем Храбрый adblocker.
- 1258,4х быстрее, чем Duckduckgo adblocker.
Загрузка блокирующего двигателя призыва (из кэша): 0,03 мс.
- 368x быстрее, чем Храбрый adblocker.
- 588x быстрее, чем УБРОК
- 3575x быстрее, чем Adblock Plus
- Duckduckgo Adblocker не предлагает сериализации, поэтому загрузка загрузки всегда является тем, что от анализа списков.
Потребление памяти блокирующего двигателя призыва (при запуске, в Chrome): 1,8 МБ
- 1.6x меньше памяти, чем УБРОК
- 8,4x меньше памяти, чем Adblock Plus
- 8,8 раза меньше памяти, чем Duckduckgo adblocker.
- Использование памяти Храбрый не может быть оценено с использованием devtools и, таким образом, не входит в этот раздел.
0. О наборе данных
Для измерения производительности каждого блокатора контента мы воспроизвели запросы от популярных доменов Однажды и следовал следить за тем временем, чтобы решить, следует ли их заблокировать или нет. Затем мы проанализировали результаты тремя разными способами: все запросы, заблокированные только и не заблокированы (взятые из того же прогона).
Этот набор данных запросов был создан с использованием пула браузеров Chrome udsloen (приводится в действие Bucketer Библиотека ) для посещения домашних страниц Топ 500 доменов (Как сообщает поиск CLIQZ), а также до 3 страниц каждого домена (выбирается случайным образом с домашней страницы) и собирать все сетевые запросы (URL URL, URL-адрес кадра). Набор данных использовался таким образом, чтобы различные страницы были посещены в случайном порядке, но запросы, видимые на каждой странице были воспроизведены, поскольку они были записаны изначально.
Набор данных состоит из 242944 запросов. Мы выпустили данные публично на этом URL: requests_top500.json.gz. . Сценарий для создания набора данных также доступен: create_dataset.js и shuffle_dataset.js был использован для перемещения запросов для получения окончательных данных.
1. Состав запросов
С целью этого сравнения мы считаем, что каждый запрос сети может быть либо заблокирован или разрешен блокатором контента; Мы называем процесс решения того, следует ли заблокировать запрос или нет: Соответствие Отказ Мы заметили, что из нашего набора данных заблокированы только ~ 19,2% (в среднем по всем блокаторам контента).
Это приводит к этому наблюдению, что блокировщики контента будут работать в среднем, если они могут эффективно решить, какие запросы на не блокировать Отказ
Фильтры, используемые для определения того, должен ли запрос быть заблокирован, являются теми из Easylist , где мы удалили все косметические правила перед запуском ориентиров. Последний список содержит 38978 Сетевые фильтры И доступен здесь: Easylist.txt Отказ
В этом отношении следует отметить, что большая доля запросов будет заблокирована путем включения дополнительных списков фильтров, таких как EasyPrivacy .
2. Время соответствовать всем запросам
Сначала мы посмотрим на все запросы (будь то в конечном итоге заблокированы или нет). Мы используем масштаб журнала для оси X (время в миллисекундах) для облегчения сравнения совокупного распределения времени, необходимого для блокаторов контента, чтобы решить, следует ли быть заблокированным запросом.
Вот разрыв 99-го процентиля и средних времен для каждого блокатора контента:
| 0,007 мс. | Азота | 0,050 мс. |
| 0,017 мс (2,7x медленнее) | УБРОК | 0,124 мс (2,5x медленнее) |
| 0,019 мс (2,9x медленнее) | Adblock Plus | 0,103 мс (2,1x медленнее) |
| 0,041 мс (6,3x медленнее) | Храбрый | 1,288 мс (25,9х медленнее) |
| 8,270 мс (медленнее 1258,4x) | Уткукго | 12,085 мс (242,5x медленнее) |
Ниже вы можете найти кумулятивные распределительные участки этих часов:
3. Время Соответствовать запросам Которые не заблокированы
Следующая таблица деталей 99-го процентиля и среднего дня для запросов не заблокировано:
| 0,006 мс. | Азота | 0,049 мс. |
| 0,018 мс (2,8 рад медленнее) | УБРОК | 0.112МС (2,3x медленнее) |
| 0,020 мс (медленнее 3,1x) | Adblock Plus | 0,105 мс (2,2x медленнее) |
| 0,038 мс (5,9x медленнее) | Храбрый | 1,270 мс (26,2x медленнее) |
| 6,781 мс (1060,5x медленнее) | Уткукго | 11.190 мс (230,5x медленнее) |
4. Время Соответствовать запросам Которые заблокированы
Следующая таблица деталей 99-го процентиля и среднего времени для запросов заблокировано:
| 0,007 мс. | Азота | 0,052 мс. |
| 0,016 мс (2,2x медленнее) | УБРОК | 0,165 мс (3,1x медленнее) |
| 0,014 мс (1,9x медленнее) | Adblock Plus | 0,099 мс (медленнее 1,9x) |
| 0,062 мс (8,5x медленнее) | Храбрый | 1,468 мс (младший 28,0x) |
| 8,31 мс (медленнее 1130,6х) | Уткукго | 13,025 мс (248,5x медленнее) |
На этих графах мы наблюдаем плато для Adblock Plus , Храбрый и Уткукго . Это можно объяснить тем, что эти двигатели реализуют некоторую форму кэширования внутренне, таким образом, имея очень быстрое время отклика для некоторых запросов, которые уже были замечены (избыточность в запросах, поступающих от обоих общих третьих лиц, которые наблюдаются на нескольких веб-сайтах, а также Факт, что мы загружаем несколько страниц для каждого домена). Эта кэширование может быть реализована сверху любого блокатора контента и не рассказывает о повышении эффективности каждого; Мы можем видеть это как средство для торговли память против Использование ЦП Отказ
Из предыдущих измерений мы видим, что outs outs – выполняет другие библиотеки с точки зрения скорости сопоставления. Не собираясь слишком много деталей, вот некоторые из оптимизаций, которые могут объяснить эти результаты:
- Rhostery использует обратный индекс, ассоциирующие токены для фильтров. Вопреки другим библиотекам мы уверены, что мы выбираем Лучший Токен для каждого фильтра во время строительства (наилучшее определение как наименее виден токен ). Это несет одноразовую дополнительную стоимость, но приводит к максимизации возможностей диспетчера.
- Фильтры хранятся в очень компактной форме, в печатных массивах, и загружены только в память лениво, когда есть шанс, что они будут заблокированы (если мы столкнулись с идентичными токенами в URL).
- Фильтры, загруженные в памяти, оптимизированы на лету и несколько фильтров могут быть объединены для повышенной эффективности. Оптимизация тщательно создавали на основе общих случаев, наблюдаемых в Easylist.
5. Сериализация и десериализация
В этом разделе мы посмотрим на производительность контент-блокаторов, когда речь идет о сериализации их внутреннего представления для более быстрой последующей нагрузки. Только Duckduckgo Двигатель не предоставляет эту функцию. УБРОК , Жостери , Adblock Plus и Храбрый Все позволяют сериализовать или кэшировать ( Ublock Origin Терминология: Selfies ) Весь блокирующий двигатель с строкой, либо буфером, который затем может использоваться для ускорения последующих нагрузок.
Поскольку это одноразовое управление, наличие более высокого времени погрузки не влияет на значительно, пользователи настольных компьютеров. С другой стороны, способность быстро инициализации контента-блокатора имеет решающее значение на мобильном.
Другим использованием, разрешенным такими возможностями, является выполнение анализа списков на бэкэнде и отправляют сериализованную форму блокировщика контента для клиентов напрямую, что полностью удаляет стоимость инициализации полностью.
Мы выполнили 100 сериализаций для каждого блокатора контента и отображаем результаты ниже:
Этот барный участок содержит среднее время, необходимое для сериализации двигателя для каждого блокатора контента:
Точно так же мы измеряем время, необходимое для восстановления блокатора контента из его сериализованной формы:
И вот среднее время:
Последнее, но не менее важное, мы измерили размер сериализованного буфера для каждого блокатора контента:
Из этих измерений мы видим, что Жостери предлагает как значительно более быструю сериализацию, так и дезерриализацию, а также меньший размер кэша.
Причина следующая: внутреннее представление уже сохраняется в основном в компактной форме (с использованием печатных массивов); Это означает, что сериализация состоит только при добавлении небольшого количества метаданных наряду на стороне уже доступных массивов и десериализация по существу мгновенно Поскольку достаточно создать несколько типовых видов массива на вершине сериализованного буфера (подумайте о MMAP Но с помощью печатных массивов) . Это также объясняет очень низкое потребление памяти: после инициализации Использование памяти немного выше, чем размер сериализованной формы.
6. Расход памяти при запуске
Здесь мы рассмотрим использование памяти каждого блокатора контента, инициализированного из списков (не из кэша) после одного полного сборника мусора. Измерения проводились с использованием снижения памяти Chrome Devtools. Мы не измеряли храброе здесь, так как память, используемая на стороне C ++, не учитывается в снисмен виде. Также имейте в виду, что это использование памяти может варьироваться в зависимости от времени, поскольку блокировщики контента могут кэшировать часто используемые ресурсы и т. Д.
Как упоминалось в предыдущем разделе о сериализации, очень низкое использование памяти Жостери Можно объяснить тем фактом, что внутреннее представление в основном состоит из очень компактных типовых массивов с небольшим надведомленным для дополнительных метаданных. Опять же, нам нужно подчеркнуть здесь, что это измеряет фильтрующий двигатель сетевого фильтрации только для призыва, а не полное расширение, как описано в введении.
7. Перечисление списков
На этом графике мы представляем время, необходимое для каждого блокатора содержимого, которое будет инициализировано из списков (без каких-либо предыдущих кэширования, что означает инициализацию всех внутренних ресурсов путем разбора сырого списка). Мы видим, что только смелые, кажется, значительно медленнее и что УБРОК , Жостери , Adblock Plus и Duckduckgo Все хорошо выполнять.
Похоже, что длительное время разборки для смелого – это Известная проблема отслеживается на своем репозитории GitHub.
Теперь, если мы удалим смелый, мы видим, что есть еще различия между УБРОК , Жостери , Adblock Plus и Duckduckgo Отказ Одна из причин Жостери медленнее, чем УБРОК и Adblockplus Вот что для достижения максимальной производительности при сопоставлении, а также минимизируйте использование памяти, есть немного больше работы, чтобы сделать работу. На практике это не имеет значения так много, поскольку это одноразовая операция, и что последующие нагрузки выполняются из кэша, и это действительно быстро (на самом деле, мы даже можем выполнить разборную боковую сторону и просто отправить сериализованную версию блокировщик, который полностью удаляет этот шаг).
8. Заключение
В этом исследовании мы смотрели внимательно по производительности некоторых из самых популярных контент-блокаторов в использовании сегодня. В частности, мы сосредоточились на эффективности своих сетевых фильтрующих двигателей, что является самой интенсивной задачей CPU, которые они выполняют.
Эта работа была мотивирована одним из претензий, сформулированных в Манифест V3 Предложение проекта хрома: «Затем расширение выполняет произвольную (и потенциально очень медленный) JavaScript« , говорить о способности контент-блокаторов для обработки всех сетевых запросов. Из измерений мы не думаем, что эта претензия удерживается, так как все популярные блокировщики контента уже очень эффективны и не должны придерживаться любого заметного замедления для пользователей. Более того, эффективность блокаторов контента – постоянно улучшать , благодаря более инновационным подходам или использованию технологий, таких как WebAsseMbly для достижения родных показателей.
Хотя большинство блокаторов контента действительно эффективны, они не эквивалентны, и мы заметили, что Жостери Выполняет последовательно или лучше по всему размерам, часто превосходящие другие библиотеки.
Мы надеемся, что эти ориентиры дадут разработчикам-блокаторам Контента, чтобы измерить свой прогресс в отношении других популярных библиотек; Принимая выгоду для всех пользователей, независимо от того, какое расширение они используют, так как повышается эффективность блокаторов контента.
Оригинал: “https://dev.to/remusao/adblockers-performance-study-5b47”