
Привет! Это снова Максим из Яндекс Браузера. Мы с командой продолжаем делиться историями об интересных и неочевидных оптимизациях производительности, которые внедряем в наш браузер. В прошлый раз мы писали о том, как улучшили стабильность GPU‑процесса, воспользовавшись оптимизациями в драйверах видеокарт, сделанными специально для Google Chrome. А сегодня речь пойдёт об ускорении старта нашего браузера на Windows.
Медленный запуск браузера — это проблема, которая может быть очень заметна и неприятна для наших пользователей. Поэтому скорость старта входит в число ключевых технических метрик, за которыми мы следим (в том числе автоматически отлавливая деградации в бенчмарках на перф‑ферме) и которые стараемся оптимизировать.
Один из способов значительно ускорить запуск — использовать фоновый режим (подобную функциональность предоставляют в том или ином виде все современные браузеры, включая Яндекс Браузер). Однако он отключён у некоторых пользователей и не даёт преимуществ при открытии браузера сразу же после старта операционной системы.
В этой статье остановимся на оптимизации медленных стартов браузера, когда ни один его процесс ещё не был запущен. Профилируя подобные старты с помощью встроенной подсистемы трейсинга на слабых устройствах с Windows (например, ноутбуках с HDD), мы заметили, что одно из узких мест — это время инициализации GPU‑процесса.
Коротко о GPU-процессе
GPU‑процесс — это выделенный процесс браузера, который отвечает за растеризацию, композитинг и презентацию конечного кадра в результате работы пайплайна рендеринга. Для понимания мультипроцессной архитектуры браузера можно прочитать одну из статей отличного цикла от разработчиков Google Chrome.
Этот процесс может работать в нескольких режимах:
С поддержкой аппаратного ускорения (aka хардварный рендеринг). Отрисовка при этом выполняется на GPU при помощи библиотек Skia (предоставляет верхнеуровневое API для рисования) и ANGLE (реализация OpenGL ES от Google, транслирующая вызовы в операции с нативными графическими API, такими как DirectX, OpenGL, Vulkan или Metal).
Без поддержки аппаратного ускорения (aka софтварный рендеринг). Рендеринг в этом режиме выполняется на CPU с помощью библиотеки Skia. При этом часть функций браузера, например, WebGL и WebGPU, будет недоступна.
Режим хардварного рендеринга, несомненно, более предпочтителен ввиду бóльшей производительности и используется по умолчанию. Но при его инициализации требуется загрузка ряда динамических библиотек (ANGLE, D3D, драйверы GPU) и создание графического контекста. Это как раз и приводит к значительным задержкам на старте браузера, которые суммарно могут достигать десятков секунд. В режиме софтварного рендеринга накладных расходов значительно меньше, из‑за чего GPU‑процесс может инициализироваться в разы быстрее.
Другим значительным фактором, влияющим на время инициализации GPU‑процесса, является вид используемого дискового устройства — HDD или SSD. Вот некоторые цифры из статистики Яндекс Браузера:
Время от старта GPU‑процесса до завершения инициализации, сек | ||
---|---|---|
Медиана |
95-й процентиль |
|
SSD, хардварный рендеринг |
0,5 |
3,3 |
SSD, софтварный рендеринг |
0,1 |
1,4 |
HDD, хардварный рендеринг |
10,1 |
64,7 |
HDD, софтварный рендеринг |
0,6 |
3,2 |
В связи с вышеописанным сама собой напрашивается мысль: нельзя ли запускать браузер с GPU‑процессом в режиме софтварного рендеринга, а потом переключать его на хардварный? Об этом в прошлом задумывались и разработчики Chromium, и мы, но идея считалась чересчур сложной для реализации.
Trampoline GPU-процесс
Реализовать такое переключение в рамках одного GPU‑процесса было бы действительно трудоёмко и, что не менее важно для нас, внесло бы большое количество конфликтов с кодовой базой Chromium. Такое решение было бы крайне тяжёлым в поддержке.
Однако в процессе изучения того, как другие процессы браузера взаимодействуют с GPU‑процессом, нам пришло в голову интересное решение. На старте мы параллельно создаём вспомогательный или, как мы его назвали, trampoline GPU‑процесс в режиме софтварного рендеринга и используем его для отрисовки, пока основной GPU‑процесс полностью не проинициализируется в хардварном режиме. Затем мы бесшовно переключаемся между ними.

Отчасти задачу упростило то, что текущая архитектура браузера в целом поддерживала смену GPU‑процесса с переключением режима отрисовки. Дело в том, что софтварный рендеринг может использоваться в качестве фолбэка при повторных крэшах GPU‑процесса в хардварном режиме. Таким образом, оставалось только поддержать возможность обратного перехода с софтварного режима на хардварный и реализовать логику по ручному переключению с trampoline GPU‑процесса на основной.
Тем не менее, в процессе реализации нам пришлось преодолеть несколько сложностей. Одной из них было промаргивание белым кадром содержимого браузера при смене GPU‑процессов, которое в перспективе могло бы раздражать пользователей.
Такой сайд‑эффект был совершенно нежелательным, поэтому нам пришлось реализовать частичную приостановку пайплайна рендеринга до полной подготовки нового кадра браузером.
Мы также имплементировали определённые ограничения по области использования trampoline GPU‑процесса: с помощью него не стоит пытаться отрисовывать элементы веб‑страниц, рассчитывающих на наличие аппаратного ускорения (например, видеоэлементы или canvas). Дело в том, что переключение с софтварного рендеринга на хардварный не является стандартным поведением и его не могут учесть веб‑разработчики. При обработке таких элементов рендеринг веб‑страницы будет приостановлен до полной инициализации основного GPU‑процесса. Это эквивалентно поведению браузера без использования trampoline GPU‑процесса.
Что получилось
Первым делом мы решили проверить эффект от использования trampoline GPU‑процесса по бенчмаркам на нашем тестовом стенде. В качестве эталонной метрики для оценки скорости старта браузера мы выбрали время первой отрисовки NTP (New Tab Page, страница новой вкладки) — именно её чаще всего видят пользователи после запуска. Замеры показали ускорение на 24%: эффект можно было заметить невооруженным взглядом.
Данные замеров

Устройство: Dell Latitude E6330, Intel Core i7–3540M 3.00GHz, Intel HD Graphics 4000, 2×4GB HMT351S6CFR8A‑PB, WDC WD5000LPCX-24VHATO
Следующим этапом было проведение A/B‑эксперимента с trampoline GPU‑процессом на небольшой доле пользователей с целью отловить возможные проблемы и точно оценить изменения метрик.
Как ожидалось, эффект от фичи оказался весьма впечатляющим среди пользователей с HDD (ускорение отрисовки NTP на старте до 28% по разным процентилям) и менее интересным, но всё равно позитивным среди пользователей с SSD (ускорение до 2%). Подробно результаты эксперимента изображены на дашборде в DataLens.

Что не менее важно, среди пользователей с HDD улучшились и продуктовые метрики: был зафиксирован статистически значимый рост числа поисков и открытий веб‑страниц с NTP.
Ну и наконец, мы не могли не попробовать сравнить наш браузер с Chromium. Страница новой вкладки в Яндекс Браузере «потяжелее», чем у визави, поэтому для более справедливого сравнения мы решили выбрать сценарий с открытием одной и той же веб‑страницы на старте браузера (например, ya.ru). Яндекс Браузер по бенчмарку оказался быстрее на 30%!
Данные замеров

Устройство: Dell Latitude E6330, Intel Core i7–3540M 3.00GHz, Intel HD Graphics 4000, 2×4GB HMT351S6CFR8A‑PB, WDC WD5000LPCX-24VHATO
Эксперимент мы признали успешным, а фичу с trampoline GPU‑процессом раскатили на всю аудиторию Яндекс Браузера для Windows начиная с версии 25.2.0.
Вот так нестандартное использование особенностей архитектуры браузера позволило нам сделать запуск браузера быстрее. Надеюсь, этот рассказ был интересен для вас, ждём вашего фидбэка в комментариях!
Комментарии (31)
grey_rat
12.05.2025 08:21А мозилла в Firefox просто сделала аппаратный GPU процесс для D3D9. Это закрывает всё железо от 2002 года.
Пример запуска и работы Firefox 128 (r3dfox) на мобильном селероне 900 мегагерц, это уровень третьего пня. Но с видеокартой GMA 900 которая умеет D3D9. Если бы была видеокарта например Radeon 9500 из того же 2002 года, браузер работал бы гораздо быстрее, так как эта карточка умеет WDDM и аппаратные вершинные шейдеры.
https://www.youtube.com/watch?v=L0Vjn9z8cC4Newpson
12.05.2025 08:21просмотр YouTube без аппаратного ускорения декодирования видео - мое почтение
grey_rat
12.05.2025 08:21Декодирование мпег2 старые видюхи умеют, а ютуб в нём не отдаёт. Вот если бы был сервис в инете по быстрому декодированию видео в мпег2, то можно было бы и в 720 видео смотреть на более слабом железе, например в браузере в плагине WMP
https://m.youtube.com/watch?v=707ZmfrogW8
На 4:15 пример с плагином, но там я разными способами видео запускал.Newpson
12.05.2025 08:21таким образом, необходимо проксировать трафик, чтобы иметь возможность комфортно выходить в современный интернет (пользовался более современным вариантом eeepc на intel atom с двумя гигами озу несколько месяцев, впечатления не очень: оперативы хватает, но одноядерный процессор является бутылочным горлышком во многих задачах), что для постоянного использования нерационально, полагаю.
p.s. сейчас, кстати, тоже использую на постоянной основе ноутбук с двумя гигами озу, но процессор уже четырехядерный атом на той же частоте; вполне хватает и для браузера, и для компиляции кода (плюсы, латех), и для документов.
p.p.s. и не менее важно - этот более новый интел атом по энергоэффективности гораздо лучше (настолько, что ему даже активное охлаждение не нужно - его просто нет), батареи хватает не на 3-4 часа, а на 6-7. То есть, он быстрее, меньше ест и обеспечивает полную тишину при работе, а стоимость... новый ноутбук я купил за 7 тысяч рублей четыре года назад - это самый низ ультрабюджетных ноутов.
grey_rat
12.05.2025 08:21таким образом, необходимо проксировать трафик, чтобы иметь возможность комфортно выходить в современный интернет
Ненужно ничего проксировать, достаточно настроить браузер https://habr.com/ru/articles/424019/
Newpson
12.05.2025 08:21не буду спорить, поскольку сам занимался этой некрофилией, тем более, уверен, вам уже очень много раз говорили о том, что это сизифов труд. Очень малый прирост "комфортности" при больших усилиях.
nixtonixto
12.05.2025 08:21Подозреваю, что и монитор там самый бюджетный, в итоге экономия сейчас на покупке нормальной машины для "компиляции кода и для документов" приведёт к проблемам со зрением в будущем... В частности, к чувствительности глаз к ШИМу, бликам на зеркальной матрице, инверсии цвета под углом, что вы пока не замечаете на своём мониторе. Я бы рекомендовал для Работы выбирать компьютер хотя бы бизнес-линеек.
Newpson
12.05.2025 08:21у меня проблемы со зрением были ещё до появления какой-либо портативной электроники :)
В ноутбуке стандартный набор: IPS матрица, 1920x1080, матовый экран, 12 дюймов (дома ноут просто к основному монитору подключаю). Есть пара битых пикселов, но на hidpi их ещё найти нужно. По сравнению с основным монитором, быть может, немного зеленит, но это можно настроить.
upd. Если вам интересно, на чём экономят. EMMC-память, расширяемая SD-памятью. Сделан из очень дешёвого пластика (уже покрыт слоем царапин), болты пластилиновые, тачпад не аппаратный (ОС его определяет, как мышь, все жесты работают на эмуляции нажатий клавишных комбинаций, но плавной прокрутки сделать нельзя), звук фонит, зарядка сгорела через несколько месяцев использования. Ну и железо (и плата внутри в целом) похоже на то, какое ставят в дешёвые windows-планшеты.
duran-duran Автор
12.05.2025 08:21В Яндекс Браузере (как и в Chromium) есть поддержка D3D9 в качестве бэкенда для ANGLE. D3D9 используется при недоступности D3D11, либо же можно зафорсить его использование с помощью настройки #use-angle на about:flags.
Yura_PST
Linux, компьютер 2012 года (i5, ssd), запуск Яндекс браузера секунд 30, а пока начнет работать автозаполнение адресов сайта - чуть ли не целая минута.
duran-duran Автор
Напишите нам через форму обратной связи в Яндекс Браузере ("Меню" -> "Помощь" -> "Обратная связь"), попробуем разобраться. Можно явно указать в письме, чтобы репорт отнесли мне.