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