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