Улучшение времени запуска DevTools

Максим Садым
Maksim Sadym

Запуск DevTools теперь происходит примерно на 13% быстрее 🎉 (с 11,2 до 10 с).

ТЛ;ДР; Результат достигается за счет удаления избыточной сериализации.

Обзор

Пока DevTools запускается, ему необходимо выполнить несколько вызовов движка JavaScript V8 .

Процесс запуска DevTools

Механизм, который Chromium использует для отправки команд DevTools в V8 (и для IPC в целом), называется mojo . Мои товарищи по команде Бенедикт Мёрер и Сигурд Шнайдер обнаружили неэффективность во время работы над другой задачей и предложили улучшить процесс, удалив два лишних шага в отправке и получении этих сообщений.

Давайте углубимся в то, как работает механизм mojo !

Механизмы mojo

Механизмы моджо

Существует команда mojo EvaluateScript , которая запускает команду JS. Он сериализует всю команду JS, включая arguments , в строку исходного кода JavaScript, которая может быть eval() . Как вы можете себе представить, эти струны могут стать довольно длинными и дорогими. После того, как команда получена V8, эти строки кода JavaScript десериализуются перед запуском. Этот процесс сериализации и десериализации каждого отдельного сообщения создает значительные накладные расходы.

Бенедикт Мойрер понял, что сериализация и десериализация arguments довольно затратны и что все шаги «Сериализация команды JS в строку JS» и «Десериализация строки JS» являются избыточными и их можно пропустить.

Технические подробности: RenderFrameHostImpl::ExecuteJavaScript

Как мы улучшились

Улучшенные механизмы

Мы представили еще один метод API Mojo, который позволяет нам напрямую передавать имя объекта, вызываемый метод и список аргументов, вместо того, чтобы создавать строку исходного кода JavaScript. Это позволяет нам пропустить сериализацию и десериализацию и устраняет необходимость анализа кода JavaScript.

Технические подробности о том, как мы реализовали эту оптимизацию, можно найти в этих двух патчах:

  1. CL 2431864: [devtools] Снижение затрат на производительность при отправке сообщений во внешнем интерфейсе.
  2. CL 2442012: [devtools] Используйте ExecuteJavaScriptMethod в DevTools

Влияние

Чтобы оценить эффективность изменения, мы провели несколько измерений, сравнивая версии Chromium cb971089a058 и 4f213b39d581 (до и после изменения).

Для обеих редакций мы запускали следующий сценарий 5 раз:

  1. Запишите трассировку, используя chrome://tracing
  2. Откройте DevTools-on-DevTools.
  3. Получите записанную трассировку CrRendererMain и сравните метрики, специфичные для V8.

Судя по этим экспериментам, DevTools открывается примерно на 13% быстрее (с 11,2 до 10 с) благодаря оптимизации.

Основные моменты, продолжительность процессора

Имя метода Не оптимизировано (мс) Оптимизировано (мс) Различия (мс) Улучшение скорости (%)
Общий 11 213,19 9 953,99 -1259,20 12,65%
v8.run 499,67 3,61 -496,06 12,65%
V8.Выполнить 1654,87 1349,61 -305,25 3,07%
v8.callFunction 1171,84 1339,77 167,94 -1,69%
v8.компилировать 133,93 3,56 -130,37 1,31%

DevTools загружает время процессора (мс)

Полная сравнительная таблица показателей трассировки

В результате DevTools открывается и работает быстрее с меньшим использованием ЦП . 🎉

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

Рассмотрите возможность использования Chrome Canary , Dev или Beta в качестве браузера для разработки по умолчанию. Эти каналы предварительного просмотра дают вам доступ к новейшим функциям DevTools, тестируют передовые API-интерфейсы веб-платформы и находят проблемы на вашем сайте раньше, чем это сделают ваши пользователи!

Связь с командой Chrome DevTools

Используйте следующие параметры, чтобы обсудить новые функции и изменения в публикации или что-либо еще, связанное с DevTools.

,

Максим Садым
Maksim Sadym

Запуск DevTools теперь происходит примерно на 13% быстрее 🎉 (с 11,2 до 10 с).

ТЛ;ДР; Результат достигается за счет удаления избыточной сериализации.

Обзор

Пока DevTools запускается, ему необходимо выполнить несколько вызовов движка JavaScript V8 .

Процесс запуска DevTools

Механизм, который Chromium использует для отправки команд DevTools в V8 (и для IPC в целом), называется mojo . Мои товарищи по команде Бенедикт Мейрер и Сигурд Шнайдер обнаружили неэффективность во время работы над другой задачей и предложили улучшить процесс, удалив два лишних шага в отправке и получении этих сообщений.

Давайте углубимся в то, как работает механизм mojo !

Механизмы mojo

Механизмы моджо

Существует команда mojo EvaluateScript , которая запускает команду JS. Он сериализует всю команду JS, включая arguments , в строку исходного кода JavaScript, которая может быть eval() . Как вы можете себе представить, эти струны могут стать довольно длинными и дорогими. После того, как команда получена V8, эти строки кода JavaScript десериализуются перед запуском. Этот процесс сериализации и десериализации каждого отдельного сообщения создает значительные накладные расходы.

Бенедикт Мейрер понял, что сериализация и десериализация arguments являются довольно дорогостоящими, и что все шаги «Сериализация команды JS в строку JS» и «Десериализация строки JS» являются избыточными и их можно пропустить.

Технические подробности: RenderFrameHostImpl::ExecuteJavaScript

Как мы улучшились

Улучшенные механизмы

Мы представили еще один API-метод Mojo, который позволяет нам напрямую передавать имя объекта, вызываемый метод и список аргументов, вместо того, чтобы создавать строку исходного кода JavaScript. Это позволяет нам пропустить сериализацию и десериализацию и устраняет необходимость анализа кода JavaScript.

Технические подробности о том, как мы реализовали эту оптимизацию, можно найти в этих двух патчах:

  1. CL 2431864: [devtools] Снижение затрат на производительность при отправке сообщений во внешнем интерфейсе.
  2. CL 2442012: [devtools] Используйте ExecuteJavaScriptMethod в DevTools

Влияние

Чтобы оценить эффективность изменения, мы провели несколько измерений, сравнив версии Chromium cb971089a058 и 4f213b39d581 (до и после изменения).

Для обеих редакций мы запускали следующий сценарий 5 раз:

  1. Запишите трассировку, используя chrome://tracing
  2. Откройте DevTools-on-DevTools.
  3. Получите записанную трассировку CrRendererMain и сравните метрики, специфичные для V8.

Судя по этим экспериментам, DevTools открывается примерно на 13% быстрее (с 11,2 до 10 с) благодаря оптимизации.

Основные моменты, продолжительность процессора

Имя метода Не оптимизировано (мс) Оптимизировано (мс) Различия (мс) Улучшение скорости (%)
Общий 11 213,19 9 953,99 -1259,20 12,65%
v8.run 499,67 3,61 -496,06 12,65%
V8.Выполнить 1654,87 1349,61 -305,25 3,07%
v8.callFunction 1171,84 1339,77 167,94 -1,69%
v8.компилировать 133,93 3,56 -130,37 1,31%

DevTools загружает время процессора (мс)

Полная сравнительная таблица показателей трассировки

В результате DevTools открывается и работает быстрее с меньшим использованием ЦП . 🎉

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

Рассмотрите возможность использования Chrome Canary , Dev или Beta в качестве браузера для разработки по умолчанию. Эти каналы предварительного просмотра дают вам доступ к новейшим функциям DevTools, тестируют передовые API-интерфейсы веб-платформы и находят проблемы на вашем сайте раньше, чем это сделают ваши пользователи!

Связь с командой Chrome DevTools

Используйте следующие параметры, чтобы обсудить новые функции и изменения в публикации или что-либо еще, связанное с DevTools.