Рубрики
Без рубрики

Виртуальный дом медленный. Встретить мемузионный дом

Sindre Osen Aarsaeter Виртуальный дом медленный. Познакомьтесь с воменой DOM.Moving за пределами виртуального дома и государственного управления. Виртуальный дом был фантастическим инновациям. Он привел к гораздо более продуктивному способу написания веб-приложений, позволяя нам написать наши взгляды в декларативной манере.

Автор оригинала: FreeCodeCamp Community Member.

Sindre Osen Aarsaeter

Выходя за пределы виртуального дома и государственного управления

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

Эта большая выгода имеет мало, чтобы сделать с производительностью первоначального визуализации. Вместо этого процесс обновления DOM для отражения изменений в вашем штате стал намного быстрее.

Этот процесс привлечения дома в синхронизации с государством часто называют Дом примирение Отказ

Если у нас был бесконечно быстрый примирение, мы могли бы значительно упростить наши приложения по Оказание всего на каждом кадре Отказ Государственный слой никогда не понадобится узнавать о взглядах вообще – гораздо меньше отправляет события и отслеживать, какие взгляды необходимо реагировать, когда определенные части состояния изменяются. Вид всегда будет синхронизирован с данными, независимо от того, что вы бросили на него.

К сожалению, виртуальные домовые реализации являются не бесконечно быстро. Они на самом деле, удивительно медленно. К счастью, многие подскочили на Bandwag на немнозримость ™ Bandwag, в этом случае виртуальный дом спасибо вам! Другие обертывают все состояние в наблюдаемых (например, MOBX) и отслеживать, какой взгляд зависит от того, в каком состоянии. Это позволяет смириться только только части вашего мнения, но поставляется с собственным набором недостатков.

Самая большая проблема заключается в том, что мы склонны решать, как управлять состоянием приложения на основе нашего просмотра уровня. Что если бы мы могли получить Лучше Производительность в мире, где слой данных и уровень просмотра на самом деле не знают или заботятся друг о друге?

Встретить мемузионный дом

Imba Является ли язык программирования для Интернета. Он включает в себя интерактивную платформу ScreenCasting scrimba.com из которых я ведущий разработчик. Imba был рожден, чтобы снова заработать разработку веб-приложений. Он имеет чистый и читаемый синтаксис, вдохновленный Ruby. Он компилируется для читаемого и исполняющего JavaScript и работает внутри существующей экосистемы.

Помимо чистого и читаемого синтаксиса, самое большое преимущество IMBA заключается в том, что он действительно относится к элементам DOM в качестве первоклассных граждан, на гораздо более глубоком уровне, чем JSX. Это позволяет вам написать представления, но это …| не использует виртуальный дом. Вместо этого IMBA компилирует вид на Memoied Dom, который оказывается порядок быстрее Отказ

Как это работает

Общая идея состоит в том, что мы создаем легкие обертки вокруг элементов DOM, а также компилируйте декларативные взгляды на цепочки.

tag AppView
    def render
        
             "Welcome"
             0.5)> "Roulette"

Выше представление IMBA выше будет примерно компилировать в следующем JavaScript:

class AppView extends Imba.Tag {
  render() {
    var $ = this.$; // inline cache for tag
    return this.setChildren($.$ = $.$ || [
      Imba.tag('h1',$).flag('title').setText("Welcome"),
      Imba.tag('p',$).flag('desc').setText("Roulette")
    ]).synced(
      $[1].flagIf('red',Math.random() > 0.5)
    );
  }
}

Это Очень Простой пример, чтобы проиллюстрировать основную концепцию. Во время компиляции мы разделяем создание и обновления в отдельные ветви. Первый раз рендер вызывается для EW> Дети будут созданы, а статические атрибуты будут установлены. На всех последующих звонках единственная реальная работа, которую мы делаем, это переворачивает класс o F o ты

. Хоть и гораздо более сложный, та же концепция используется для условных, петель, и все остальное внутри деревьев тегов.

Если вы заинтересованы в том, как это действительно работает, я рекомендую читать Это вступление Отказ

Ориентир

Большинство ориентировчиков тестируют такие вещи, как «Вставка/случайно/удалить 1000 строк». Это дает мало признаков реальной эффективности. Когда есть сотни изменений, большая часть разницы съедает фактическими мутациями DOM, перекраски и т. Д. Это не измеряет наиболее важной метрики.

Если вы действительно хотите проверить производительность примирения DOM, вам нужно посмотреть, как быстро реализация приносит DOM в синхронизации с состоянием, Особенно Когда нет/без изменений Отказ

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

Этот тест Шаги через детерминированную последовательность государственных изменений, делать не более Одно изменение на итерацию Отказ Мы измерим время, необходимое для согласования Вся приложение View после:

  1. Переключение завершению задачи
  2. Удаление задачи
  3. Вставка задачи
  4. Переименование задачи
  5. Ничего не делать

Полученные результаты

Запуск теста на IMAC (4 ГГц I7) дает следующие результаты:

Safari 11.

  • IMBA 1.3: 360458 OPS/SEC.
  • Реагировать 16.2: 9752 OPS/SEC - 36,96x медленнее
  • Vue 2.5: 8719 OPS/SEC - 41,34x медленнее

Chrome 65.

  • IMBA 1.3: 282484 OPS/SEC.
  • Реагировать 16.2: 8882 OPS/SEC - 31,81x медленнее
  • Vue 2.5: 8103 OPS/SEC - 34,86x медленнее

Firefox 58.

  • IMBA 1.3: 234334 OPS/SEC.
  • Реагировать 16.2: 5075 OPS/SEC - 46,17x медленнее
  • Vue 2.5: 3119 OPS/SEC - 75.13x медленнее

Это кажется возмутительным правильно? Конечно, это не может быть правильным.

  • Все реализации - Действительно примиряться на каждом шаге.
  • Все реализации блокируют, синхронно и детерминированные.
  • Все реализации выполняют одинаковое количество мутаций DOM.
  • Да, мы используем министерзированную продукцию реагирования. Версия для разработки - 200x медленнее чем IMBA на том же тесте.
  • Воме воменой DOM создает практически без мусора во время итерации, использует меньше памяти в целом и концептуально очень просто.

Все реализации, вероятно, могут быть оптимизированы больше. Я очень рад принять pull-запросы на Github Отказ Быть ясным, у меня огромное уважение к тому, что реагировал, и я действительно люблю Vue. Имба взяла много вдохновения от этого. Я подозреваю, что должно быть возможно для компиляции Vue шаблонов, используя аналогичный подход, и полюбил бы кого-то, чтобы дать ему идти!

Профилирование

Давайте проверим производительность RAW Reconciler, когда даже нет никаких изменений. Это удаляет время, потраченное на фактические мутации DOM из уравнения, и дает нам хорошую картину о том, сколько работы происходит во время примирения. Профиль CPU Charted из Chrome дает визуальную индикацию того, насколько меньше работает с метеологическими методом DOM.

IMBA 1.3

Реагировать 16.2

Vue 2.5.

Это масштабируется?

Это цитата от кого-то, кто прочитал ранний черновик этой статьи, и я хотел бы решить его голову. Разница производительности не ограничивается простым тестом, совсем наоборот. Imba был использован в производстве в течение нескольких лет на scrimba.com С Но это все еще не для слабого сердца. Для большинства разработчиков массовые экосистемы для Vue и реагирования будут жесткими (и, вероятно, неразумными) оставить позади. Документация IMBA Все еще оставляет многое желать, но мы улучшаем это каждый день.

Это имеет значение?

Я уверен, что вы слышали, что реагирование достаточно быстро. Но достаточно быстро для чего? Это не имеет значения, если реагировать на 15% быстрее, но с порядком улучшения величины мы можем начать исследовать более простые способы создания приложений.

Это не о воспринимается Скорость, но о том, что она позволяет вам сделать. На scrimba.com Мы не беспокойтесь о том, чтобы сохранить вид синхронизации с состоянием. Мы не беспокойтесь о отслеживании, когда состояние изменилось. Наши модели данных не наблюдаются. Мы просто оказываемся. В любое время. И это освобождает.

Оригинал: “https://www.freecodecamp.org/news/the-virtual-dom-is-slow-meet-the-memoized-dom-bb19f546cc52/”