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

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

· 6 мин. чтения
команда V8

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

Поставлена цепочка Ignition и TurboFan для ES.next (и не только)

Начиная с версии 5.6, V8 может оптимизировать весь язык JavaScript. Более того, многие функции языка направляются через новую оптимизирующую цепочку в V8. Эта цепочка использует интерпретатор Ignition V8 в качестве базового уровня и оптимизирует часто выполняемые методы с помощью более мощного оптимизирующего компилятора TurboFan V8. Новая цепочка активируется для новых функций языка (например, для многих новых функций из спецификаций ES2015 и ES2016) или в тех случаях, когда Crankshaft («классический» оптимизирующий компилятор V8) не может оптимизировать метод (например, try-catch, with).

Почему мы направляем только часть функций языка JavaScript через новую цепочку? Новая цепочка лучше подходит для оптимизации всего спектра языка JS (прошлого и настоящего). Она является более современной, с более здоровой кодовой базой, и специально разработана для сценариев реального использования, включая работу V8 на устройствах с небольшим объёмом памяти.

Мы начали использовать Ignition/TurboFan для новейших функций ES.next, которые мы добавили в V8 (ES.next = функции JavaScript, определённые в спецификациях ES2015 и позднее), и будем направлять через неё больше функций, продолжая улучшать её производительность. В среднесрочной перспективе команда V8 стремится переключить всё выполнение JavaScript в V8 на новую цепочку. Однако, до тех пор, пока существуют случаи реального использования, где Crankshaft быстрее запускает JavaScript, чем новая цепочка Ignition/TurboFan, в краткосрочной перспективе мы будем поддерживать обе цепочки, чтобы гарантировать, что код JavaScript, выполняющийся в V8, максимально быстр во всех ситуациях.

Итак, почему новая цепочка использует и новый интерпретатор Ignition, и новый оптимизирующий компилятор TurboFan? Для быстрого и эффективного выполнения JavaScript требуется несколько механизмов или уровней внутри виртуальной машины JavaScript для выполнения низкоуровневой работы. Например, полезно иметь первый уровень, который быстро начинает выполнение кода, и второй оптимизирующий уровень, который тратит больше времени на компиляцию часто используемых функций, чтобы максимально увеличить производительность длительно выполняемого кода.

Ignition и TurboFan — два новых уровня выполнения V8, которые наиболее эффективны в сочетании. В силу соображений эффективности, простоты и размеров TurboFan разработан для оптимизации методов JavaScript, начиная с байткода, создаваемого интерпретатором Ignition V8. Благодаря разработке обеих компонентов для тесного взаимодействия, могут быть реализованы оптимизации, которые возможны из-за присутствия другого компонента. В результате, начиная с версии 5.6 все функции, которые будут оптимизированы TurboFan, сначала проходят через интерпретатор Ignition. Использование единой цепочки Ignition/TurboFan позволяет оптимизировать функции, которые ранее было невозможно оптимизировать, поскольку теперь они могут использовать оптимизационные проходы TurboFan. Например, благодаря направлению Генераторов через Ignition и TurboFan, производительность генераторов существенно выросла — почти втрое.

Для получения дополнительной информации о переходе V8 на Ignition и TurboFan, пожалуйста, ознакомьтесь с посвящённым постом в блоге Бенедикта.

Улучшения производительности

V8 версии 5.6 предлагает ряд ключевых улучшений в памяти и производительности.

Задержки, вызванные памятью

Фильтрация запоминаемого набора в параллельном режиме была введена: ещё один шаг к Orinoco.

Значительное улучшение производительности ES2015

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

Цель V8 — уменьшить разницу в производительности между транспайлерами и "родной" производительностью ES.next в V8, чтобы устранить последнюю проблему. Мы достигли значительного прогресса в приведении производительности новых языковых функций к уровню транспайлированных эквивалентов ES5. В этом выпуске вы найдете, что производительность функций ES2015 значительно быстрее, чем в предыдущих выпусках V8, и в некоторых случаях производительность функций ES2015 приближается к производительности их транспайлированных эквивалентов ES5.

В частности, оператор spread теперь можно использовать нативно. Вместо того, чтобы писать…

// Как Math.max, но возвращает 0 вместо -∞, если нет аргументов.
function specialMax(...args) {
if (args.length === 0) return 0;
return Math.max.apply(Math, args);
}

…вы теперь можете писать…

function specialMax(...args) {
if (args.length === 0) return 0;
return Math.max(...args);
}

…и получать аналогичные результаты производительности. В частности, V8 v5.6 включает оптимизации для следующих микротестов:

См. график ниже для сравнения между V8 v5.4 и v5.6.

Сравнение производительности функций ES2015 между V8 v5.4 и v5.6 с использованием SixSpeed

Это только начало; в следующих выпусках будет еще больше новинок!

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

String.prototype.padStart / String.prototype.padEnd

String.prototype.padStart и String.prototype.padEnd — это последние дополнения стадии 4 к ECMAScript. Эти библиотечные функции официально включены в версию v5.6.

примечание

Примечание: Снова не включено.

Предпросмотр WebAssembly в браузере

В Chromium 56 (включая V8 v5.6) будет доступен предпросмотр WebAssembly в браузере. Пожалуйста, смотрите подробности в специальной статье блога.

API V8

Пожалуйста, ознакомьтесь с резюме изменений API. Этот документ регулярно обновляется через несколько недель после каждого крупного выпуска.

Разработчики с активным клоном репозитория V8 могут использовать git checkout -b 5.6 -t branch-heads/5.6, чтобы поэкспериментировать с новыми функциями в V8 v5.6. В качестве альтернативы вы можете подписаться на Beta-канал Chrome и вскоре самостоятельно попробовать новые функции.