Производительность браузера

Улучшение производительности браузера с помощью кэширования байт-кода

Компиляция байт-кода может сократить время выполнения JavaScript на встроенной платформе

Просмотр веб-страниц — одно из наиболее важных программ для вычислительных устройств, таких как смартфоны, планшеты, ноутбуки и т. д. Пользователь посещает набор веб-сайтов, и это доминирует в общем времени просмотра. Современные браузеры кэшируют загруженные ресурсы на локальных дисках, такие как файлы HTML, JavaScript и изображения. Экономя пропускную способность сети, кэширование ресурсов не устраняет избыточные вычисления для обработки этих файлов и не повышает производительность браузера.

Кэширование байт-кода:

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

Эффективный метод кэширования байт-кода в памяти может значительно повысить производительность веб-браузера и уменьшить объем памяти.

Расширенный байт-код в фоновом режиме:

движок JavaScript — это виртуальная машина, выполняющая сценарии, написанные на языке JavaScript, на который приходится большая часть времени выполнения веб-браузера. JavaScript — это динамический язык, для которого точная переменная известна только во время выполнения, и статическому компилятору сложно создавать эффективные коды. Таким образом, широко используются интерпретаторы байт-кода, дополненные компиляцией Just-In-Time. Компилятор JIT вызывается для создания оптимизированного собственного двоичного файла для кэширования. При следующем выполнении управление программой переходит непосредственно к собственному двоичному файлу вместо запуска цикла интерпретатора. Таким образом, он работает намного лучше, чем интерпретируемый байт-код, и имеет большое значение с точки зрения циклов ЦП и объема памяти.

JavaScript также предоставляет функцию eval, которая оценивает произвольное выражение, представленное в String, и повышает гибкость выполнения. Это может быть полезно в нескольких задачах, таких как добавление и удаление полей, перехват ошибок, десериализация объектов JSON и т. д., но у него есть некоторые плохие побочные эффекты для производительности и безопасности. Функция Eval может изменяться динамически, поэтому динамический компилятор должен генерировать байт-коды при каждом вызове функции. Это замедляет выполнение, и злоумышленник может заставить браузер выполнить вредоносный скрипт через eval, чтобы скомпрометировать браузер.

Выполнение:

Во-первых, методы JavaScript или функция eval анализируются для создания абстрактного синтаксического дерева (AST), которое компилируется в байт-коды. В движке JavaScript, если скомпилированный код выполняется более 10 раз, байт-код будет преобразован в простой собственный код с помощью JIT-компиляции. Если код выполняется более 1000 раз, горячий код будет преобразован в более оптимизированный собственный код. Эта структура используется большинством популярных движков JS, таких как SpiderMonkey, движок Apple, V8 и т. д.

Каждый метод JavaScript скомпилирован в байт-коды, которые инкапсулированы в объект в движке JS. Для сериализации и десериализации этого объекта и API внешнего представления данных (XDR) для механизма JavaScript используются аналогичные механизмы для других механизмов JavaScript.

Область действия функции eval определяется динамически, SpiderMonkey по-разному генерирует байт-коды для функций eval и обычных методов JavaScript. Он компилируется в байт-код только при первом вызове и повторно используется через кэш в памяти в каждом сеансе.

Кэширование в памяти полезно не для всех методов JavaScript, его необходимо разработать, чтобы определить, какие методы использовать повторно. Основной принцип заключается в том, что метод кэшируется только в том случае, если его компиляция занимает значительно больше времени, чем десериализация.

Оценка:

Чтобы сравнить разницу в производительности с доступом к вводу-выводу и без него, все файлы байт-кода сбрасываются из буферного кэша (с помощью команды blockdev -flushbufs) перед измерением для кэширования файлов. Кэширование в памяти сокращает общее время выполнения JavaScript на 24,9% по сравнению с готовым движком на встроенных платформах.

Как функции eval, так и методы JavaScript относительно нечувствительны к изменению порогового значения, поскольку они имеют большую плоскую область на кривой производительности на встроенной платформе.

Кэширование байт-кода в памяти значительно повышает производительность за счет амортизации затрат на компиляцию за счет повторного использования данных между вызовами. Для эффективного повторного использования определенных методов, которые могут выиграть от кэширования кода.

Дайте мне знать ваши мысли об этой статье в качестве ответа.

Первоначально опубликовано на https://centocode.com 29 января 2021 г.