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

Релиз V8 v6.2

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

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

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

Производительность Object#toString ранее уже была выявлена как возможное узкое место, так как эта функция часто используется такими популярными библиотеками, как lodash и underscore.js, а также такими фреймворками, как AngularJS. Различные вспомогательные функции, такие как _.isPlainObject, _.isDate, angular.isArrayBuffer или angular.isRegExp часто используются в коде приложений и библиотек для выполнения проверок типов во время выполнения.

С появлением ES2015 функция Object#toString стала доступна для изменения с использованием нового символа Symbol.toStringTag, что также сделало функцию Object#toString более тяжеловесной и более сложной для ускорения. В этом выпуске мы портировали оптимизацию, изначально реализованную в JavaScript-движке SpiderMonkey, в V8, увеличив производительность Object#toString в 6,5× раз.

Это также повлияло на тест Speedometer для браузеров, особенно на подзадачу AngularJS, где мы измерили улучшение на 3%. Прочитайте подробный пост в блоге для получения дополнительной информации.

Мы также значительно улучшили производительность прокси ES2015, ускорив вызовы прокси-объектов через someProxy(params) или new SomeOtherProxy(params) до раз:

Аналогично была улучшена производительность доступа к свойству прокси-объекта через someProxy.property почти на 6,5× раз:

Это часть продолжающейся стажировки. Следите за дальнейшими публикациями в блоге и итоговыми результатами.

Мы также рады сообщить, что благодаря вкладам от Peter Wong, производительность встроенной функции String#includes улучшилась более чем в раза по сравнению с предыдущим выпуском.

Поиски по хэш-кодам для внутренних хэш-таблиц стали значительно быстрее, что привело к улучшению производительности Map, Set, WeakMap и WeakSet. Предстоящий пост в блоге объяснит эту оптимизацию подробно.

Сборщик мусора теперь использует параллельный механизм очистки для сбора так называемого молодого поколения кучи.

Улучшенный режим работы с низкой памятью

За последние несколько выпусков режим работы V8 с низкой памятью был улучшен (например, путем установки начального размера полу-пространства в 512 КБ). Устройства с низким объемом памяти теперь реже сталкиваются с ситуациями нехватки памяти. Однако это поведение при низком объеме памяти может негативно повлиять на производительность во время выполнения.

Новые функции регулярных выражений

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

/foo.bar/su.test('foo\nbar'); // true

Утверждения с обратным просмотром, еще одна новая возможность регулярных выражений, теперь доступны по умолчанию. Название уже довольно точно описывает их смысл. Утверждения с обратным просмотром позволяют ограничить шаблон так, чтобы он совпадал только в том случае, если перед ним стоит шаблон в группе обратного просмотра. Существуют варианты как для совпадений, так и для несоответствий:

/(?<=\$)\d+/.exec('$1 стоит около ¥123'); // ['1']
/(?<!\$)\d+/.exec('$1 стоит около ¥123'); // ['123']

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

Ревизия литералов шаблона

Ограничение на escape-последовательности в литералах шаблона было ослаблено в соответствии с соответствующим предложением. Это открывает новые возможности для использования тегов шаблонов, такие как создание процессора LaTeX.

const latex = (strings) => {
// …
};

const document = latex`
\newcommand{\fun}{\textbf{Увлекательно!}}
\newcommand{\unicode}{\textbf{Юникод!}}
\newcommand{\xerxes}{\textbf{Король!}}
Краткая над 'h' идет \u{h}ер // Недопустимый токен!
`;

Увеличена максимальная длина строки

Максимальная длина строки на 64-битных платформах увеличилась с 2**28 - 16 до 2**30 - 25 символов.

Удален Full-codegen

В V8 v6.2 окончательные крупные части старого пайплайна были удалены. В этом выпуске было удалено более 30 тысяч строк кода — серьезное упрощение сложности кода.

API V8

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

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