Релиз V8 версии 7.2
Каждые шесть недель мы создаем новую ветвь V8 как часть нашего процесса релиза. Каждая версия ответвляется от главной ветки Git V8 сразу перед бета-этапом Chrome. Сегодня мы рады представить нашу новейшую ветвь, версию V8 7.2, которая находится в бета-версии до её релиза в стабильной версии Chrome 72 через несколько недель. V8 v7.2 содержит множество полезных функций для разработчиков. Этот пост предоставляет предварительный обзор некоторых ключевых моментов в преддверии релиза.
Память
Встроенные функции теперь поддерживаются и включены по умолчанию на архитектуре ia32.
Производительность
Парсинг JavaScript
В среднем веб-страницы тратят 9.5% времени на старте V8 на парсинг JavaScript. Поэтому мы сосредоточили усилия на выпуске самого быстрого парсера JavaScript в V8 версии 7.2. Мы значительно ускорили парсинг в целом. С версии 7.0 скорость парсинга увеличилась примерно на 30% на настольных компьютерах. Следующий график демонстрирует впечатляющие улучшения на нашем реальном тесте загрузки Facebook за последние месяцы.
Мы фокусировались на улучшении парсера в разные периоды. Следующие графики показывают улучшения относительно последнего релиза v7.2 на нескольких популярных веб-сайтах.
В целом, недавние улучшения сократили средний процент времени на парсинг с 9.5% до 7.5%, что привело к более быстрому времени загрузки и увеличению отзывчивости страниц.
async
/await
V8 версия 7.2 содержит ускоренную реализацию async
/await
, которая включена по умолчанию. Мы сделали предложение спецификации и сейчас собираем данные о совместимости с веб для того, чтобы изменения были официально добавлены в спецификацию ECMAScript.
Элементы распространения (spread)
V8 версия 7.2 значительно улучшает производительность элементов распространения, когда они находятся в начале литерала массива, например [...x]
или [...x, 1, 2]
. Улучшение распространяется на массивы, строки, множества, ключи и значения карт, а также — через расширение — на Array.from(x)
. Подробнее см. наше подробное описание ускорения элементов распространения.
WebAssembly
Мы проанализировали несколько тестов WebAssembly и использовали их для улучшения генерации кода на верхнем уровне выполнения. В частности, V8 v7.2 задействует разбиение узлов в планировщике оптимизирующего компилятора и ротацию циклов в бэкэнде. Мы также улучшили кэширование оболочек и ввели пользовательские оболочки, которые снижают затраты на вызов импортированных функций математики JavaScript. Кроме того, мы разработали изменения для распределителя регистров, которые улучшат производительность для многих типов кода, что будет реализовано в будущей версии.
Обработчики ловушек
Обработчики ловушек улучшают общую пропускную способность кода WebAssembly. Они реализованы и доступны на Windows, macOS и Linux в V8 версии 7.2. В Chromium они включены на Linux. Windows и macOS последуют, когда будет подтверждена их стабильность. Мы также работаем над их доступностью на Android.
Асинхронные трассировки стека
Как упомянуто ранее, мы добавили новую функцию, называемую асинхронные трассировки стека без затрат, которая обогащает свойство error.stack
асинхронными кадрами вызова. В настоящее время она доступна за командой --async-stack-traces
.
Особенности языка JavaScript
Публичные поля классов
V8 версия 7.2 добавляет поддержку публичных полей классов. Вместо следующего кода:
class Animal {
constructor(name) {
this.name = name;
}
}
class Cat extends Animal {
constructor(name) {
super(name);
this.likesBaths = false;
}
meow() {
console.log('Мяу!');
}
}
…теперь вы можете написать:
class Animal {
constructor(name) {
this.name = name;
}
}
class Cat extends Animal {
likesBaths = false;
meow() {
console.log('Мяу!');
}
}
Поддержка приватных полей классов запланирована в будущих релизах V8.
Intl.ListFormat
V8 версия 7.2 добавляет поддержку предложения Intl.ListFormat
, позволяя локализованное форматирование списков.
const lf = new Intl.ListFormat('en');
lf.format(['Франк']);
// → 'Франк'
lf.format(['Франк', 'Кристина']);
// → 'Франк и Кристина'
lf.format(['Франк', 'Кристина', 'Флора']);
// → 'Франк, Кристина и Флора'
lf.format(['Франк', 'Кристина', 'Флора', 'Харрисон']);
// → 'Франк, Кристина, Флора и Харрисон'
Для получения дополнительной информации и примеров использования ознакомьтесь с нашим пояснением Intl.ListFormat
.
Корректный JSON.stringify
JSON.stringify
теперь выводит escape-последовательности для одиночных суррогатов, делая его вывод допустимым в Unicode (и представимым в UTF-8):
// Старое поведение:
JSON.stringify('\uD800');
// → '"�"'
// Новое поведение:
JSON.stringify('\uD800');
// → '"\\ud800"'
Для получения дополнительной информации см. наше пояснение корректного JSON.stringify
.
Экспорт пространств имен модулей
В модулях JavaScript уже можно было использовать следующий синтаксис:
import * as utils from './utils.mjs';
Однако симметричного синтаксиса export
не существовало… до сих пор:
export * as utils from './utils.mjs';
Это эквивалентно следующему:
import * as utils from './utils.mjs';
export { utils };
API V8
Пожалуйста, используйте git log branch-heads/7.1..branch-heads/7.2 include/v8.h
, чтобы получить список изменений API.
Разработчики с активной версией V8 могут использовать git checkout -b 7.2 -t branch-heads/7.2
, чтобы протестировать новые функции в V8 v7.2. Альтернативно, вы можете подписаться на Beta-канал Chrome и скоро попробовать новые функции самостоятельно.