Выпуск V8 v9.1
Каждые шесть недель мы создаем новую ветку V8 как часть нашего процесса выпуска. Каждая версия создается из главной ветки V8 сразу перед выпуском Chrome Beta. Сегодня мы рады представить нашу последнюю ветку, версию V8 9.1, которая будет находиться в beta до ее выпуска вместе с Chrome 91 Stable через несколько недель. Версия V8 v9.1 наполнена всевозможными новшествами для разработчиков. В этом посте представлен краткий обзор некоторых ключевых моментов в ожидании выпуска.
JavaScript
Улучшения FastTemplateCache
API V8 предоставляет интерфейс Template
для интеграторов, из которого можно создавать новые экземпляры.
Создание и настройка новых объектов требует выполнения нескольких шагов, поэтому часто быстрее клонировать существующие объекты. V8 использует двухуровневую стратегию кеширования (небольшой быстрый массив кеша и большой медленный словарь кеша) для поиска недавно созданных объектов на основе шаблонов и их прямого клонирования.
Ранее индекс кеша для шаблонов назначался в момент их создания, а не при их добавлении в кеш. Это приводило к тому, что быстрый массив кеша резервировался для шаблонов, которые зачастую вообще не создавались. Исправление этого привело к улучшению на 4,5% в бенчмарке Speedometer2-FlightJS.
Await на верхнем уровне
Await на верхнем уровне включен по умолчанию в V8 начиная с версии 9.1 и доступен без --harmony-top-level-await
.
Обратите внимание, что для рендеринга Blink await на верхнем уровне уже был включен по умолчанию в версии 89.
Интеграторы должны знать, что с этим изменением v8::Module::Evaluate
всегда возвращает объект v8::Promise
вместо значения завершения. Promise
разрешается значением завершения в случае успешной оценки модуля и отклоняется с ошибкой в случае неудачи. Если оцениваемый модуль не является асинхронным (т.е. не содержит await на верхнем уровне) и не имеет асинхронных зависимостей, возвращенный Promise
будет либо выполнен, либо отклонен. В противном случае возвращенный Promise
будет находиться в ожидании.
Пожалуйста, ознакомьтесь с нашим объяснением для получения дополнительных деталей.
Проверка частных брендов, также известная как #foo in obj
Синтаксис проверки частных брендов включен по умолчанию в версии 9.1 без необходимости использования --harmony-private-brand-checks
. Эта функция расширяет оператор in
, позволяя работать с именами частных полей (с префиксом #
), как в следующем примере.
class A {
static test(obj) {
console.log(#foo in obj);
}
#foo = 0;
}
A.test(new A()); // true
A.test({}); // false
Для более детального рассмотрения обязательно ознакомьтесь с нашим объяснением.
Короткие встроенные вызовы
В этом выпуске временно выключены встроенные функции (отменяется встраивание функций) на 64-битных настольных машинах. Производительность, которую дает отмена встраивания на этих машинах, превосходит затраты памяти. Это связано как с архитектурными, так и с микроархитектурными особенностями.
Мы скоро опубликуем отдельный блог-пост с более подробной информацией.
API V8
Используйте git log branch-heads/9.0..branch-heads/9.1 include/v8.h
, чтобы получить список изменений API.
Разработчики с активной копией V8 могут использовать git checkout -b 9.1 -t branch-heads/9.1
, чтобы опробовать новые функции в версии V8 v9.1. Либо вы можете подписаться на бета-канал Chrome и попробовать новые функции самостоятельно в ближайшее время.