Есть большой массив данных, который нужно перебрать с помошью JS, так, что бы максимально снизить нагрузку на браузер.
К примеру: массив состоит из 10 000 элементов, и каждый элемент состоит из массива по 10 элементов, и нужно перебрать этот массив, а перебирал его с помошью foreach, но он очень сильно нагружает браузер, и браузер умирает на 10-30 сек
Например, если на каждой подитерацией вы стучитесь в дом - то да, тут, кончено, всё плохо...
Не думаю, что все даже в таком случае. У меня ноуту 10 лет, за 3-4 сек перебирает все дом-дерево на 2-3 тыс элементов иерархично (у каждого элемента запрашивает список непосредственных детей) плюс обращается к каждому элементу еще по раза три (tagname, id, classname) и после строится дерево этих элементов, в котором 10+тыс. новых, к которым, хоть и не ко всем, скрипт тоже обращается.
В общем 100 тыс итераций даже с 1-2 несложными манипуляциями с дом для компа 3-5 летней давности - плевое дело.
Но если там какая-то дичь с 3д и десяток опенджиэл операций на каждом шагу, то это жопен.
Смотреть короче нужно, что там за массив и какие колдунства делаются...
Aleksandr-JS-Developer,
Ну у меня childs тоже не волшебным образом формируется. )
И дерево со 100+тыс элементов строится тоже не очень линейно (примерно та же картина по времени).
А "залазит в DOM, перебирает его весь, пока не найдёт" это только для извратов типа поиска по контенту. Стандартные селекторы вроде индексируются.
Но ХЗ, что у него там...
Я не думаю, что в браузерах не реализована какая-то система индексации.
вот попробовал. Есль 1М дивов с классами от ---0--- до ---999999--- и один с айди ---1000000--- в самом конце. Выборки
Разница между поиском '.---999998---' и '.---999999---' существенная, порядка в два раза.
Ну, я специально такую взял. А так: 2 (иногда 3), 90-100, 90-100 (иногда до 200+, но это в браузере что-то еще видимо колдуется - вкладок ок. 20 открыто)
Кстати, а какой вы использовали браузер?
FF
Хотя эксперимент интересный, надо потыкать его ещё. Посмотреть какие есть дифференциальные группы селекторов и совпадают ли они в разных браузерах...
Можно было бы, но лень. ))
Понятно, что там есть какие-то оптимизации...А это - самые дорогие операции во фронте.
Это да. Что можно отметить, что при оч большом кол-ве элементов в дом и при частом доступе к ним по загадочным правилам - фильтрации, - можно дополнить механизм выборки какими-то своими оптимизациями. Но это изврат, в таком случае нужно смотреть в корень и искать грабли в архитектуре...
100000 итераций должны отлетать максимум за полторы-две секунды. Там что-то тяжелое делается? Если да, то из предложенных Сергеем двух каноничных вариантов, скорее всего, лучше будет с таймером. Хотя если там у тебя бинарные массивы, то можно и воркер замутить (бинари могут идти в другой тред без копирования)