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

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

· 3 мин. чтения
Штефан Херхут ([@herhut](https://twitter.com/herhut)), клонированный создатель клонов

Каждые шесть недель мы создаём новую ветку V8 в рамках нашего процесса релизов. Каждая версия разветвляется из основного репозитория Git V8 сразу перед стадией Beta Chrome. Сегодня мы рады представить нашу новейшую ветку, V8 версия 7.1, которая находится в стадии бета-тестирования до её выпуска вместе с Chrome 71 Stable через несколько недель. V8 v7.1 наполнен различными инструментами для разработчиков. В этом посте представлен обзор некоторых главных нововведений в ожидании релиза.

Память

После работы в версиях v6.9/v7.0 по встраиванию встроенных функций непосредственно в бинарный файл, обработчики байткода для интерпретатора теперь также встроены в бинарный файл. Это экономит около 200 КБ в среднем на каждый Isolate.

Производительность

Анализ выхода в TurboFan, который выполняет замену объектов, локальных для некоторой единицы оптимизации, был улучшен, чтобы также обрабатывать локальные контексты функций для функций высшего порядка, когда переменные из окружающего контекста попадают в локальное замыкание. Рассмотрим следующий пример:

function mapAdd(a, x) {
return a.map(y => y + x);
}

Обратите внимание, что x является свободной переменной локального замыкания y => y + x. V8 v7.1 теперь может полностью исключить выделение контекста для x, что приводит к улучшению до 40% в некоторых случаях.

Улучшение производительности с новым анализом выхода (меньше — лучше)

Анализ выхода теперь также может устранять некоторые случаи доступа к индексам переменных в локальных массивах. Вот пример:

function sum(...args) {
let total = 0;
for (let i = 0; i < args.length; ++i)
total += args[i];
return total;
}

function sum2(x, y) {
return sum(x, y);
}

Обратите внимание, что args являются локальными для sum2 (предполагая, что sum встроен в sum2). В V8 v7.1 TurboFan теперь может полностью исключить выделение args и заменить доступ к индексам переменных args[i] на тернарную операцию вида i === 0 ? x : y. Это улучшает производительность ~на 2% в тесте JetStream/EarleyBoyer. Мы можем расширить эту оптимизацию для массивов с более чем двумя элементами в будущем.

Структурное клонирование модулей Wasm

Наконец, поддерживается использование postMessage для модулей Wasm. Объекты WebAssembly.Module теперь можно передавать с помощью postMessage веб-воркерам. Уточним: это ограничено только веб-воркерами (тот же процесс, разные потоки) и не распространяется на межпроцессные сценарии (такие как междоменный postMessage или общие веб-воркеры).

Функции JavaScript языка

API Intl.RelativeTimeFormat позволяет локализованно форматировать относительное время (например, «вчера», «42 секунды назад» или «через 3 месяца») без потери производительности. Вот пример:

// Создайте форматтер относительного времени для английского языка,
// который не всегда должен использовать числовое значение в выводе.
const rtf = new Intl.RelativeTimeFormat('en', { numeric: 'auto' });

rtf.format(-1, 'day');
// → 'вчера'

rtf.format(0, 'day');
// → 'сегодня'

rtf.format(1, 'day');
// → 'завтра'

rtf.format(-1, 'week');
// → 'на прошлой неделе'

rtf.format(0, 'week');
// → 'на этой неделе'

rtf.format(1, 'week');
// → 'на следующей неделе'

Прочтите наше объяснение Intl.RelativeTimeFormat для дополнительной информации.

V8 v7.1 также добавляет поддержку предложения globalThis, предоставляя универсальный механизм доступа к глобальному объекту даже в строгих функциях или модулях, независимо от платформы.

API V8

Используйте git log branch-heads/7.0..branch-heads/7.1 include/v8.h, чтобы получить список изменений API.

Разработчики с активной копией V8 могут использовать git checkout -b 7.1 -t branch-heads/7.1, чтобы поэкспериментировать с новыми функциями в V8 v7.1. Или вы можете подписаться на бета-канал Chrome и вскоре попробовать новые функции самостоятельно.