Релиз V8 версии v9.3
Каждые шесть недель мы создаем новую ветку V8 в рамках нашего процесса релиза. Каждая версия отделяется от основной ветки Git V8 непосредственно перед выходом Chrome Beta. Сегодня мы рады объявить о нашей новой ветке, версии V8 9.3, которая находится в стадии бета-тестирования до ее выхода одновременно с Chrome 93 Stable через несколько недель. V8 v9.3 полна различных нововведений для разработчиков. В этом посте представлен предварительный обзор некоторых ключевых моментов в преддверии релиза.
JavaScript
Пакетная компиляция в Sparkplug
Мы выпустили наш сверхбыстрый новый JIT-компилятор среднего уровня Sparkplug в версии v9.1. Из соображений безопасности V8 защищает от записи память, где хранится сгенерированный код, требуя переключения разрешений между режимами записи (во время компиляции) и выполнения. Это реализовано с использованием вызовов mprotect
. Однако, поскольку Sparkplug генерирует код настолько быстро, то затраты на вызов mprotect
для каждой отдельной функции стали значительным узким местом в производительности компиляции. В версии V8 v9.3 мы вводим пакетную компиляцию для Sparkplug: Вместо компиляции каждой функции отдельно, мы компилируем несколько функций в одном пакете. Это снижает затраты на переключение разрешений страниц памяти, так как оно выполняется только один раз на пакет.
Пакетная компиляция уменьшает общее время компиляции (Ignition + Sparkplug) до 44% без ухудшения выполнения JavaScript. Если рассматривать только стоимость компиляции кода Sparkplug, то влияние, очевидно, еще значительнее, например, уменьшение на 82% для теста docs_scrolling
(см. ниже) на Windows 10. Удивительно, но пакетная компиляция улучшила производительность компиляции даже больше, чем снижение стоимости W^X, поскольку выполнение подобных операций вместе обычно лучше для процессора. На графике ниже показано влияние W^X на время компиляции (Ignition + Sparkplug) и насколько хорошо пакетная компиляция снизила эти затраты.
Object.hasOwn
Object.hasOwn
— это более доступный аналог для Object.prototype.hasOwnProperty.call
.
Например:
Object.hasOwn({ prop: 42 }, 'prop')
// → true
Более подробную (но не намного более!) информацию можно найти в нашем описании функции.
Причина ошибки
Начиная с версии v9.3, различные встроенные конструкторы Error
расширены для приема объекта с параметрами, содержащего свойство cause
в качестве второго параметра. Если такой объект передается, значение свойства cause
устанавливается как собственное свойство экземпляра Error
. Это предоставляет стандартизированный способ связывания ошибок.
Например:
const parentError = new Error('parent');
const error = new Error('parent', { cause: parentError });
console.log(error.cause === parentError);
// → true
Как обычно, более подробную информацию смотрите в нашем описании функции.
Отключение защиты от недоверенного кода на Android
Три года назад мы внедрили набор мер защиты для генерации кода для защиты от атак Spectre. Мы всегда понимали, что это временное решение, которое предоставляет лишь частичную защиту от атак Spectre. Единственная эффективная защита — это изоляция веб-сайтов через Site Isolation. Изоляция сайтов включена в Chrome на настольных устройствах уже некоторое время, однако включение полной изоляции сайтов на Android было сложнее из-за ограничений ресурсов. Однако, начиная с Chrome 92, изоляция сайтов на Android была включена для большего количества сайтов, содержащих чувствительные данные.
Таким образом, мы решили отключить меры защиты генерации кода V8 для Spectre на Android. Эти меры менее эффективны, чем изоляция сайтов, и создают издержки на производительность. Их отключение ставит Android на один уровень с настольными платформами, где они были отключены с версии V8 v7.0. Отключение этих мер принесло значительные улучшения производительности в тестах на Android.
API V8
Пожалуйста, используйте git log branch-heads/9.2..branch-heads/9.3 include/v8.h
, чтобы получить список изменений API.