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

Релиз V8 v6.4

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

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

Скорость

V8 v6.4 улучшает производительность оператора instanceof в 3,6 раза. Как прямой результат, uglify-js теперь работает на 15–20% быстрее согласно инструментальному тесту V8.

В этом выпуске также решены проблемы производительности в Function.prototype.bind. Например, TurboFan теперь постоянно встраивает все мономорфные вызовы функции bind. Кроме того, TurboFan также поддерживает паттерн привязанных обратных вызовов, что позволяет вместо следующего:

doSomething(callback, someObj);

использовать:

doSomething(callback.bind(someObj));

Таким образом, код становится более читаемым, при этом вы сохраняете ту же производительность.

Благодаря последним взносам от Питера Вонга, WeakMap и WeakSet теперь реализованы с использованием CodeStubAssembler, что приводит к улучшению производительности до 5 раз на всех уровнях.

В рамках непрерывных усилий V8 по улучшению производительности встроенных методов массивов, мы увеличили производительность Array.prototype.slice примерно в 4 раза, переосмыслив его реализацию с использованием CodeStubAssembler. Кроме того, вызовы Array.prototype.map и Array.prototype.filter теперь встроены во многих случаях, что обеспечивает производительность, сравнимую с версиями, написанными вручную.

Мы стремились к тому, чтобы загрузки за пределами массива, типизированного массива и строки не вызывали падения производительности в 10 раз после того, как заметили этот паттерн кодирования, используемый в дикой природе.

Память

Встроенные кодовые объекты и обработчики байт-кода V8 теперь десериализуются по запросу из снимка, что может значительно сократить использованную память для каждого Isolate. Тесты в Chrome показывают экономию в несколько сотен килобайт на вкладку при просмотре популярных сайтов.

Ищите отдельную публикацию в блоге на эту тему в начале следующего года.

Возможности языка ECMAScript

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

В регулярных выражениях с флагом /u экраны свойств Unicode теперь включены по умолчанию.

const regexGreekSymbol = /\p{Script_Extensions=Greek}/u;
regexGreekSymbol.test('π');
// → true

Поддержка именованных групп захвата в регулярных выражениях теперь включена по умолчанию.

const pattern = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u;
const result = pattern.exec('2017-12-15');
// result.groups.year === '2017'
// result.groups.month === '12'
// result.groups.day === '15'

Подробнее об этих функциях можно узнать в нашем посте в блоге под названием Предстоящие возможности регулярных выражений.

Благодаря Groupon V8 теперь реализует import.meta, который позволяет встраивающим элементам отображать метаданные хоста о текущем модуле. Например, Chrome 64 предоставляет URL модуля через import.meta.url, и Chrome планирует добавить больше свойств в import.meta в будущем.

Для улучшения форматирования строк, созданных интернационализированными форматтерами, разработчики теперь могут использовать Intl.NumberFormat.prototype.formatToParts(), чтобы форматировать число в список токенов и их типов. Спасибо Igalia за реализацию этого в V8!

API V8

Пожалуйста, используйте git log branch-heads/6.3..branch-heads/6.4 include/v8.h, чтобы получить список изменений API.

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