Релиз V8 версии 7.1
Каждые шесть недель мы создаём новую ветку 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 и вскоре попробовать новые функции самостоятельно.