
На этой неделе Google выпустила последнюю версию своего браузера, которая позволяет замораживать группы вкладок и запускать PWA при старте. Внутренне Chrome 91 стал на 23% быстрее благодаря паре нововведений в JavaScript.
Важным компонентом быстродействия браузера является быстрая обработка JavaScript. В Chrome эту задачу выполняет движок V8, который ежедневно обрабатывает более 78 лет кода JavaScript.
Всё начинается с нового компилятора JavaScript, который «заполняет пробел между необходимостью быстро начать выполнение и оптимизацией кода для максимальной производительности». Для первого сценария Chrome использует компилятор Ignition, а для второго — Turbofan. Оба были представлены три года назад как часть двухуровневой системы компиляции.
Ignition — это интерпретатор байт-кода, задача которого — начать выполнение JavaScript с минимальной задержкой. Turbofan — это оптимизирующий компилятор, который генерирует высокопроизводительный машинный код на основе информации, собранной во время выполнения JavaScript; в результате он запускается медленнее, чем компилятор байт-кода Ignition.
Sparkplug добавляет еще один компилятор и «находит баланс» между ними, поскольку он генерирует нативный машинный код, но не зависит от информации, полученной при выполнении кода JavaScript.
Это позволяет ему быстро начать выполнение, генерируя при этом относительно быстрый код. Для полного технического анализа того, что потребовалось для создания этого нового движка, пожалуйста, ознакомьтесь с нашим постом в блоге V8.
Тем временем, короткие встроенные вызовы позволяют движку V8 оптимизировать размещение сгенерированного кода в памяти, избегая косвенных переходов при вызове функций.
Когда V8 генерирует специфичный для процессора код из JavaScript, он размещает этот код в памяти. Этот сгенерированный код будет часто вызывать встроенные функции, которые представляют собой небольшие фрагменты кода для обработки общих процедур — от базовых операций, таких как сложение двух переменных, до полноценных функций в стандартной библиотеке JavaScript. Для некоторых процессоров вызов функций, находящихся далеко от вашего сгенерированного кода, может привести к сбою внутренних оптимизаций процессора (например, логики предсказания ветвлений). Решение этой проблемы заключается в копировании встроенных функций в тот же регион памяти, что и сгенерированный код.
Google утверждает, что короткие встроенные вызовы «особенно эффективны для нового чипа Apple M1», с более подробной технической информацией здесь. В целом, благодаря этим обновлениям JavaScript, Chrome 91 теперь работает до 23% быстрее и экономит 17 лет процессорного времени пользователей каждый день.