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

Релиз 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) до 5× раз:

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

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

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

Поиски по хэш-кодам для внутренних хэш-таблиц стали значительно быстрее, что привело к улучшению производительности 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 и самостоятельно скоро попробовать новые функции.