Релиз V8 версии 5.6
Каждые шесть недель мы создаём новую ветку 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 включает оптимизации для следующих микротестов:
- деструктуризация
- деструктуризация массива
- деструктуризация строки
- for-of массива
- генератор
- spread
- spread генератора
- spread литерал
См. график ниже для сравнения между V8 v5.4 и v5.6.
Это только начало; в следующих выпусках будет еще больше новинок!
Функции языка
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 и вскоре самостоятельно попробовать новые функции.