Релиз V8 версии 6.9
Каждые шесть недель мы создаем новую ветку V8 в рамках нашего процесса выпуска. Каждая версия ветвится от мастер-ветки Git V8 непосредственно перед этапом Chrome Beta. Сегодня мы рады объявить нашу новую ветку, версию V8 6.9, которая находится в бета-версии до выпуска в стабильной версии Chrome 69 через несколько недель. V8 версии 6.9 наполнен всевозможными полезными инструментами для разработчиков. В этом посте представлен предварительный обзор некоторых основных моментов в ожидании выпуска.
Экономия памяти благодаря встроенным функциям
V8 поставляется с обширной библиотекой встроенных функций. Примерами являются методы встроенных объектов, такие как Array.prototype.sort
и RegExp.prototype.exec
, а также широкий круг внутренней функциональности. Поскольку их генерация занимает продолжительное время, встроенные функции компилируются во время сборки и сериализуются в снимок, который затем десериализуется во время выполнения для создания начального состояния кучи JavaScript.
Встроенные функции сейчас занимают 700 КБ в каждом Isolate (Isolate примерно соответствует вкладке браузера в Chrome). Это весьма расточительно, и в прошлом году мы начали работать над сокращением этого объема. В V8 версии 6.4 мы выпустили ленивую десериализацию, гарантируя, что каждый Isolate оплачивает только те встроенные функции, которые ему действительно нужны (но при этом каждый Isolate все еще имел свою собственную копию).
Встроенные функции делают еще один шаг вперед. Встроенная функция разделяется всеми Isolate и встраивается непосредственно в двоичный файл, вместо того чтобы копироваться в кучу JavaScript. Это означает, что встроенные функции существуют в памяти только один раз независимо от того, сколько Isolate работают, что особенно полезно сейчас, когда изоляция сайтов активирована по умолчанию. С встроенными функциями мы наблюдали среднее сокращение размера кучи V8 на 9% на 10 000 крупнейших веб-сайтов на x64. На этих сайтах 50% экономят как минимум 1.2 МБ, 30% экономят как минимум 2.1 МБ, а 10% экономят 3.7 МБ и более.
V8 версии 6.9 поставляется с поддержкой встроенных функций на платформах x64. Другие платформы скоро последуют в грядущих выпусках. Дополнительные детали смотрите в нашем посвященном посте.
Производительность
Liftoff, новый компилятор первого уровня для WebAssembly
WebAssembly получил новый базовый компилятор для намного более быстрого времени запуска сложных веб-сайтов с большими модулями WebAssembly (такими как Google Earth и AutoCAD). В зависимости от оборудования мы наблюдаем ускорение более чем в 10 раз. Для более детальной информации обратитесь к подробному посту о Liftoff.
Ускоренные операции с DataView
DataView
методы были реализованы заново в V8 Torque, что избавляет от затратных вызовов в C++ по сравнению с предыдущей реализацией времени выполнения. Более того, теперь мы встраиваем вызовы к методам DataView
, когда компилируем код JavaScript в TurboFan, что дает еще лучшую пиковую производительность для горячего кода. Использовать DataView
теперь так же эффективно, как и использовать TypedArray
, наконец сделав DataView
подходящим выбором в ситуациях, критичных к производительности. Мы будем говорить об этом подробнее в готовящемся посте о DataView
, следите за обновлениями!
Ускоренная обработка WeakMap
во время сборки мусора
V8 версии 6.9 уменьшает время паузы сборки мусора Mark-Compact благодаря улучшенной обработке WeakMap
. Параллельная и инкрементальная маркировка теперь сможет обрабатывать WeakMap
, тогда как ранее вся эта работа выполнялась в финальной атомарной паузе Mark-Compact GC. Поскольку не вся работа может быть вынесена за пределы паузы, GC теперь также выполняет больше работы параллельно для дополнительного сокращения времени паузы. Эти оптимизации фактически сократили среднее время паузы для Mark-Compact GC в веб-бенчмарке наполовину.
WeakMap
обработка использует алгоритм итерации фиксированной точки, который в некоторых случаях может приводить к квадратичному временному поведению. С новым выпуском V8 теперь может переключаться на другой алгоритм, который гарантированно завершится за линейное время, если GC не завершится в течение определенного количества итераций. Ранее могли быть созданы примеры худшего случая, на выполнение которых GC требовалось несколько секунд даже с относительно небольшим объемом кучи, тогда как линейный алгоритм завершится за несколько миллисекунд.
Особенности языка JavaScript
V8 v6.9 поддерживает Array.prototype.flat
и Array.prototype.flatMap
.
Array.prototype.flat
рекурсивно разворачивает переданный массив до указанной глубины
, которая по умолчанию равна 1
:
// Развернуть на один уровень:
const array = [1, [2, [3]]];
array.flat();
// → [1, 2, [3]]
// Развернуть рекурсивно, пока в массиве не останется вложенных массивов:
array.flat(Infinity);
// → [1, 2, 3]
Array.prototype.flatMap
похож на Array.prototype.map
, но разворачивает результат в новый массив.
[2, 3, 4].flatMap((x) => [x, x * 2]);
// → [2, 4, 3, 6, 4, 8]
Для получения дополнительных сведений см. наш объяснитель Array.prototype.{flat,flatMap}
.
API V8
Используйте git log branch-heads/6.8..branch-heads/6.9 include/v8.h
, чтобы получить список изменений API.
Разработчики с активной копией V8 могут использовать git checkout -b 6.9 -t branch-heads/6.9
, чтобы испытать новые возможности V8 v6.9. Кроме того, вы можете подписаться на Бета-канал Chrome и опробовать новые функции самостоятельно вскоре.