- 1
- 2
- 3
- 4
- 5
var cont_els = section.el.getElementsByClassName('cont');
for (var i = 0; i < cont_els.length; i++)
{
var node_els = cont.el.getElementsByClassName('node');
for (var i = 0; i < node_els.length; i++)
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+153
var cont_els = section.el.getElementsByClassName('cont');
for (var i = 0; i < cont_els.length; i++)
{
var node_els = cont.el.getElementsByClassName('node');
for (var i = 0; i < node_els.length; i++)
Вложенный цикл переписывает i внешнего, и так бесконечно.
"В новой версии появится ключевое слово let, которое позволит объявлять переменные с блочной областью видимости"
var a = 5;
function test() {
console.log(a);
var a = 123;
}
test(); // undefined!
Да никогда вроде бы такого не было... Древние сишки требовали объявлять в начале блока.
Если уж пытаться улучшить, то было бы логичнее использовать одну выборку типа '.cont > .node'.
Еще не факт, что сформировать массивы из элементов, которые, судя по всему потом фильтровать будет выгоднее, чем пойти по пути nextSibling || firstChild.nextSibling. Но я сильно сомневаюсь, что такие уловки нужны, я еще ни разу не видел реальной необходимости оптимизации запросов к ДОМу (хотя накосячить можно везде, конечно).
Пруф: http://jsperf.com/jquery-class-vs-getelementsbyclassname-class/9
Во всем проекте используется jQuery, но узкие места переписываю на чистом яваскрипте. Ускорение в десятки раз, без шуток.
ЗЫ. Когда-то, когда ДОМ АПИ были действительно очень медленными, был какой-то такой способ:
ХЗ. как оно соотносится с современными возможностями. Ну и понятно, что если сильно хочется производительности, то callback нужно вручную заинлайнить. Так написано для наглядности.
Другое дело, что этих узких мест в обычных проектах бывает крайне мало, и смысла там что-то оптимизировать нет.
Прямо на этой странице.
Мои результаты после нескольких десятков запусков:
native - 16-39ms
jQuery - 286-312ms
Внутри jQuery регулярки для обработки селекторов, сам jQuery-обьект создается, + какие то кроссбраузерные проверки по идее могут быть.
Не то оптимизируете / или не так. Оптимизировать запросы к ДОМу - имеет смысл если у вас там база данных на ХМЛ построена (т.е. там этого ДОМа десятки мегабайтов). Для обычной ХТМЛ страницы не может в принципе быть ситуации, когда запросы будут проблемой.
И да, по поводу выборки ".cont > .node". такая штука не пойдет, потому, что мне нужно знать номер .cont, и еще сам .cont нужен, чтобы с ним кое что сделать.
"Для обычной ХТМЛ страницы не может в принципе быть ситуации, когда запросы будут проблемой."
Для обычной в принципе не может быть. А у меня - приложение с драгндропом, и нужно уметь быстро обновлять координаты всех перетаскиваемых элементов на странице, а их может быть много.
Так же нужно уметь быстро сохранять все дерево элементов, поскольку требуется оперативное автосохранение.
Ну и если этот код выполняется в обработчике события движения мышки - то нахрена делать выборку в этом обработчике? Сделать один раз до и один раз после. Все равно во время движения зажатой мышки пользователь никак структуру документа не поменяет.
Код выше никак не поможет оперативно сохранить все дерево, и ж.квери тут тоже не помощник.
Допустим, вы делаете линейный поиск в массиве.
Обнаружилось, что библиотечных indexOf проигрывает циклу на 20%. А если переписать узкое место сишке, получим ещё выигрыш на 70%. А если запараллелить поиск, то ещё на 40%.
Но тут выясняется, что ищем мы в ответе от базы занных, где правильный where даст гораздо больший performance win.
Долгое время, значит, ошибался, думая, что если профит можно получить на отказе от некоторых функций библиотеки, то так по всей библиотеке.