Стоимость JavaScript в 2019 году
Примечание: Если вам больше нравится смотреть презентацию, чем читать статьи, наслаждайтесь видео ниже! Если нет, пропустите видео и продолжайте читать.
Примечание: Если вам больше нравится смотреть презентацию, чем читать статьи, наслаждайтесь видео ниже! Если нет, пропустите видео и продолжайте читать.
Это вторая часть нашей серии, объясняющей, как V8 разбирает JavaScript максимально быстро. Первая часть объясняла, как мы сделали сканер V8 быстрым.
Разбор — это этап, на котором исходный код преобразуется в промежуточное представление для последующего использования компилятором (в V8 — это компилятор байт-кода Ignition). Разбор и компиляция происходят на критическом пути запуска веб-страницы, при этом не все функции, отправленные в браузер, немедленно требуются при старте. Даже если разработчики могут откладывать такой код с помощью асинхронного и отложенного выполнения скриптов, это не всегда осуществимо. Кроме того, многие веб-страницы содержат код, который используется только для определенных функций, которые пользователь может вообще не запустить в течение работы страницы.
Кэширование кода (также известное как кэширование байткода) представляет собой важную оптимизацию в браузерах. Оно сокращает время запуска часто посещаемых веб-сайтов путем кэширования результата анализа и компиляции. Большинство популярных браузеров реализуют различные формы кэширования кода, и Chrome не является исключением. На самом деле, мы писали и рассказывали о том, как Chrome и V8 сохраняют скомпилированный код в кэше.
V8 версии 7.4 теперь поддерживает выполнение JavaScript без выделения исполняемой памяти во время выполнения.
В своей стандартной конфигурации V8 сильно зависит от возможности выделять и изменять исполняемую память во время выполнения. Например, оптимизирующий компилятор TurboFan создает машинный код для «горячих» функций JavaScript (JS) непосредственно перед выполнением, а большинство регулярных выражений JS компилируются в машинный код с помощью движка irregexp. Создание исполняемой памяти во время выполнения — одна из ключевых причин высокой скорости V8.
Array.prototype.sort
был одним из последних встроенных методов, реализованных на JavaScript с самохостингом в V8. Его портирование предоставило нам возможность экспериментировать с различными алгоритмами и стратегиями реализации, а затем наконец сделать его стабильным в V8 v7.0 / Chrome 70.
Встроенные функции V8 (builtins) потребляют память в каждом экземпляре V8. Число встроенных функций, средний размер и количество экземпляров V8 на вкладке браузера Chrome значительно выросли. В этом посте мы расскажем, как смогли уменьшить медианный размер кучи V8 на сайте на 19% за последний год.
Этот пост описывает технику сборки мусора, называемую параллельной маркировкой. Оптимизация позволяет JavaScript-приложению продолжать выполнение, пока сборщик мусора сканирует кучу для нахождения и маркировки живых объектов. Наши тесты показывают, что параллельная маркировка сокращает время, затрачиваемое на маркировку в главном потоке, на 60%–70%. Параллельная маркировка является последним элементом проекта Orinoco — проекта по постепенной замене старого сборщика мусора новым, в основном параллельным и многопоточным сборщиком мусора. Параллельная маркировка включена по умолчанию в Chrome 64 и Node.js v10.
TL;DR: Начиная с Chrome 66, V8 компилирует исходный код JavaScript в фоновом потоке, сокращая время, затрачиваемое на компиляцию в главном потоке, на 5–20% на типичных веб-сайтах.
Начиная с версии 41, Chrome поддерживает парсинг исходных файлов JavaScript в фоновом потоке через API V8 StreamedSource
. Это позволяет V8 начинать парсинг исходного кода JavaScript, как только Chrome загрузил первый фрагмент файла из сети, и продолжать парсинг параллельно с потоковой передачей файла через сеть в Chrome. Это может значительно улучшить время загрузки, так как V8 может почти завершить парсинг JavaScript к моменту завершения загрузки файла.
Отладка утечек памяти в Chrome 66 стала намного проще. В инструментах разработчика Chrome теперь можно трассировать и создавать снимки C++ DOM объектов, а также отображать все достижимые DOM объекты из JavaScript с их ссылками. Эта функция является одним из преимуществ нового механизма трассировки C++ сборщика мусора V8.
ECMAScript 2015 ввел несколько новых структур данных, таких как Map, Set, WeakSet и WeakMap, которые используют хеш-таблицы под капотом. Этот пост описывает последние улучшения в том, как V8 v6.3+ хранит ключи в хеш-таблицах.