Перейти к основному содержимому

Релиз V8 версии 7.2

· 5 мин. чтения
Андреас Хаас, обработчик ловушек

Каждые шесть недель мы создаем новую ветвь 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 за последние месяцы.

Время парсинга V8 на facebook.com (меньше - лучше)

Мы фокусировались на улучшении парсера в разные периоды. Следующие графики показывают улучшения относительно последнего релиза v7.2 на нескольких популярных веб-сайтах.

Время парсинга V8 относительно версии 7.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 и скоро попробовать новые функции самостоятельно.