V8 быстрее и безопаснее, чем когда-либо!
Добро пожаловать в захватывающий мир V8, где скорость — это не просто функция, а образ жизни. Наступил момент попрощаться с 2023 годом и отпраздновать впечатляющие достижения, которых V8 достиг в этом году.
Благодаря инновационным оптимизациям производительности V8 продолжает расширять границы возможного в постоянно меняющемся ландшафте Веба. Мы представили новый компилятор среднего уровня и реализовали множество улучшений в инфраструктуре компилятора высокого уровня, среде выполнения и сборщике мусора, что привело к значительному увеличению скорости работы.
Помимо улучшений производительности, мы внедрили захватывающие новые функции как для JavaScript, так и для WebAssembly. Мы также предложили новый подход к эффективному переносу языков программирования с управляемой памятью в веб с помощью WebAssembly Garbage Collection (WasmGC).
Но наша приверженность к совершенству на этом не заканчивается — мы также уделили большое внимание безопасности. Мы улучшили нашу инфраструктуру песочницы и внедрили Контроль целостности потока выполнения (CFI) в V8, обеспечивая более безопасную среду для пользователей.
Ниже мы выделили некоторые ключевые моменты этого года.
Мы представили новый оптимизирующий компилятор под названием Maglev, стратегически размещенный между нашими существующими компиляторами Sparkplug и TurboFan. Он выполняет роль высокоскоростного оптимизирующего компилятора, эффективно генерируя оптимизированный код с впечатляющей скоростью. Он генерирует код примерно в 20 раз медленнее, чем наш базовый не оптимизирующий компилятор Sparkplug, но в 10–100 раз быстрее, чем компилятор высокого уровня TurboFan. Мы наблюдали значительные улучшения производительности с Maglev: JetStream улучшился на 8.2%, а Speedometer — на 6%. Более высокая скорость компиляции Maglev и уменьшенная зависимость от TurboFan привели к сокращению энергопотребления V8 на 10% в процессе выполнения Speedometer. Хотя он еще не полностью завершен, текущая версия Maglev оправдала свой дебют в Chrome 117. Подробнее в нашем блоге.
Turboshaft: новая архитектура для компилятора высокого уровня
Maglev не был нашей единственной инвестицией в улучшение технологий компиляции. Мы также внедрили Turboshaft, новую внутреннюю архитектуру нашего компилятора высокого уровня Turbofan, что сделало его не только проще в дальнейшем расширении новыми оптимизациями, но и быстрее в компиляции. Начиная с Chrome 120, все фазы бэкенда, не зависящие от ЦП, используют Turboshaft вместо Turbofan, и процесс компиляции проходит примерно в два раза быстрее, чем раньше. Это экономит энергию и создает основу для более впечатляющих приростов производительности в следующем году и далее. Следите за обновлениями!
Более быстрый HTML-парсер
Мы обнаружили, что значительная часть времени наших тестов производительности уходит на обработку HTML. Хотя это напрямую и не связано с V8, мы решили применить наш опыт в оптимизации производительности для добавления более быстрого HTML-парсера в Blink. Эти изменения привели к заметному увеличению показателей Speedometer на 3.4%. Влияние на Chrome оказалось настолько положительным, что проект WebKit сразу же интегрировал эти изменения в свой репозиторий. Мы гордимся своим вкладом в общую цель создания более быстрого интернета!
Более эффективные DOM-выделения
Мы также активно работали над DOM. Были сделаны значительные оптимизации в стратегиях выделения памяти в Oilpan — выделителе для DOM-объектов. Он получил пул страниц, что значительно снизило стоимость обращения к ядру. Oilpan теперь поддерживает как сжатые, так и несжатые указатели, и мы избегаем сжатия полей с высокой нагрузкой в Blink. Учитывая, как часто осуществляется декомпрессия, это имело широкое влияние на производительность. Кроме того, зная, насколько быстро работает выделитель памяти, мы перевели на Oilpan классы, которые часто выделяются, что увеличило скорость операций выделения в 3 раза и показало значительное улучшение в тестах производительности, ориентированных на DOM, таких как Speedometer.
Новые функции JavaScript
JavaScript продолжает развиваться с новыми стандартизированными функциями, и этот год не стал исключением. Мы добавили масштабируемые ArrayBuffers и передачу ArrayBuffer, String isWellFormed
и toWellFormed
, флаг v
для RegExp (также известный как нотация множеств Unicode), JSON.parse
with source, группировка массивов, Promise.withResolvers
и Array.fromAsync
. К сожалению, нам пришлось удалить помощники для итераторов после обнаружения несовместимости с вебом, но мы работали с TC39 для устранения этой проблемы и скоро снова реализуем данную функцию. Наконец, мы также сделали код ES6+ JS быстрее, исключив избыточные проверки зоны временной мёртвости для привязок let
и const
.
Обновления WebAssembly
В этом году для Wasm появилось множество новых функций и улучшений производительности. Мы добавили поддержку multi-memory, tail-calls (подробнее см. в нашем блоге) и relaxed SIMD для обеспечения производительности нового уровня. Мы завершили реализацию memory64 для приложений с большими объемами памяти и ждем, когда предложение достигнет четвертой стадии, чтобы мы смогли его внедрить! Мы включили последние обновления в предложение по обработке исключений, сохранив поддержку предыдущего формата. И мы продолжили инвестировать в JSPI для разблокировки еще одного крупного класса приложений в вебе. Оставайтесь с нами в следующем году!
Сборка мусора в WebAssembly
Говоря о введении новых классов приложений в веб, мы наконец реализовали сборку мусора для WebAssembly (WasmGC) после нескольких лет работы над стандартизацией'и реализацией этой функции. Теперь в Wasm появилась встроенная возможность выделения объектов и массивов, которые управляются существующим сборщиком мусора V8. Это позволяет компилировать приложения, написанные на Java, Kotlin, Dart и подобных языках, с использованием сборки мусора в Wasm, что обычно делает их в два раза быстрее, чем при компиляции в JavaScript. Подробности читайте в нашем блоге.
Безопасность
В области безопасности наши три основные темы в этом году были песочницы, фаззинг и CFI. В области песочниц мы сосредоточились на создании недостающей инфраструктуры, такой как таблица доверенных указателей и кода. В области фаззинга мы инвестировали в развитие инфраструктуры, создание специализированных фаззеров и улучшение охвата языков. Некоторые из наших работ были освещены в этой презентации. Наконец, в области CFI мы заложили основу для нашей архитектуры CFI, чтобы она могла быть реализована на как можно большем количестве платформ. Помимо этого, заслуживают внимания такие усилия, как работа над снижением эффекта популярной техники эксплуатации уязвимостей в the_hole
и запуск новой программы вознаграждения за уязвимости в виде V8CTF.
Заключение
В течение года мы работали над многочисленными поэтапными улучшениями производительности. Совокупное влияние этих небольших проектов, а также описанных в блоге, огромно! Ниже приведены результаты тестирования, демонстрирующие улучшения производительности V8, достигнутые в 2023 году, общий рост составил 14%
для JetStream и впечатляющие 34%
для Speedometer.
Эти результаты показывают, что V8 быстрее и безопаснее, чем когда-либо. Пристегнитесь, разработчики, потому что с V8 путешествие в мир быстрого и стремительного веба только начинается! Мы стремимся оставить V8 лучшим движком JavaScript и WebAssembly на планете!
От всей команды V8 мы желаем вам радостного праздничного сезона, полного быстрых, безопасных и восхитительных впечатлений в Интернете!