🔥

Тред (Роман Дворнов)


Итак, скоро заканчивается мое время в качестве ведущего, потому финальная история с философским, надеюсь, финалом :)

Начну с продолжения темы про списки :) Они используются в платформе, хоть это и не всегда очевидно

Например, DOM узлы имеют childNodes. Но дети так же представляют собой двунаправленный список, "связаны" по previousSibling/nextSibling

Не смотря на то, что childNodes ведет похоже на массив, обычно это интерфейс к двусвязному списку + индекс (кеш) по необходимости

Дизайн DOM таков, что браузеру нет нужды обращаться к произвольному ребенку ноды, потому не создаются лишние структуры -> экономия ресурсов

Построение индекса для ноды иницируется только нашим с вами кодом. Он строится при первом обращении к childNodes, путем обхода всего списка

Инвалидация кеша происходит при мутации списка, т.е. добавлении, удалении или перемещении дочернего узла

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

Так что, даже если единожды делается childNodes[N], то браузер вынужден обойти весь список, построить индекс и только тогда вернуть N-ю ноду

И вот кажется, что можно было бы избежать построение индекса, раз запрашивается лишь одна нода (оптимизация), но обычно это нельзя сделать

Причина в том, что обычно JS и DOM разные компоненты, работают через биндинги, не имеют общих данных и оптимизатора

Сделано так для лучшей модульности. Но может вести к performance bottleneck или утечкам памяти (напр. часть цикла в JS,часть в DOM)

Насколько знаю, пока только в MS решились на объединение JS c DOM, случилось это еще в IE9 blogs.msdn.microsoft.com/ie/2010/09/02/… blogs.msdn.microsoft.com/ie/2010/08/04/…

Это помогло улучшить IE, но не сильно. Т.к. имплементация DOM старая (20 лет), очень медленная и никогда серьезно не рефакторилась

Но они начали работать над этим, и в некотором будущем появится в Edge blogs.windows.com/msedgedev/2015…

Когда закончат, у нас будет ответ – насколько эффективным может быть DOM и бенефиты от тесной его интеграции с JS

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

Если в результате DOM ускорят в 1,5-3 раза, появится новый класс оптимизаций основанный на структуре DOM и его использования в JS...

... то это может изменить наш подход к решениям. Например, концепции вроде Virtual DOM потеряют смысл в плане ускорения (останется удобство)