- 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 внешнего, и так бесконечно.
bormand 01.04.2014 21:34 # +2
1024-- 01.04.2014 21:49 # +3
Itareo 01.04.2014 21:51 # +6
bormand 01.04.2014 21:59 # +2
Itareo 01.04.2014 22:00 # +2
"В новой версии появится ключевое слово let, которое позволит объявлять переменные с блочной областью видимости"
1024-- 01.04.2014 22:09 # +1
Itareo 01.04.2014 22:12 # +2
var a = 5;
function test() {
console.log(a);
var a = 123;
}
test(); // undefined!
1024-- 01.04.2014 22:16 # +2
Itareo 01.04.2014 22:18 # +1
bormand 01.04.2014 22:22 # +3
Да никогда вроде бы такого не было... Древние сишки требовали объявлять в начале блока.
1024-- 01.04.2014 22:57 # +1
Lokich 01.04.2014 22:39 # +4
Itareo 01.04.2014 22:45 # +1
bormand 01.04.2014 22:46 # +1
Itareo 01.04.2014 21:50 # +2
wvxvw 01.04.2014 22:44 # +1
Если уж пытаться улучшить, то было бы логичнее использовать одну выборку типа '.cont > .node'.
Еще не факт, что сформировать массивы из элементов, которые, судя по всему потом фильтровать будет выгоднее, чем пойти по пути nextSibling || firstChild.nextSibling. Но я сильно сомневаюсь, что такие уловки нужны, я еще ни разу не видел реальной необходимости оптимизации запросов к ДОМу (хотя накосячить можно везде, конечно).
bormand 01.04.2014 22:50 # 0
Itareo 01.04.2014 22:58 # +3
Пруф: http://jsperf.com/jquery-class-vs-getelementsbyclassname-class/9
Во всем проекте используется jQuery, но узкие места переписываю на чистом яваскрипте. Ускорение в десятки раз, без шуток.
Itareo 01.04.2014 22:59 # +2
wvxvw 01.04.2014 23:13 # +2
ЗЫ. Когда-то, когда ДОМ АПИ были действительно очень медленными, был какой-то такой способ:
ХЗ. как оно соотносится с современными возможностями. Ну и понятно, что если сильно хочется производительности, то callback нужно вручную заинлайнить. Так написано для наглядности.
Itareo 01.04.2014 23:21 # +1
Другое дело, что этих узких мест в обычных проектах бывает крайне мало, и смысла там что-то оптимизировать нет.
wvxvw 01.04.2014 23:34 # +1
Itareo 01.04.2014 23:42 # +1
Прямо на этой странице.
Мои результаты после нескольких десятков запусков:
native - 16-39ms
jQuery - 286-312ms
Внутри jQuery регулярки для обработки селекторов, сам jQuery-обьект создается, + какие то кроссбраузерные проверки по идее могут быть.
wvxvw 01.04.2014 23:51 # +2
Не то оптимизируете / или не так. Оптимизировать запросы к ДОМу - имеет смысл если у вас там база данных на ХМЛ построена (т.е. там этого ДОМа десятки мегабайтов). Для обычной ХТМЛ страницы не может в принципе быть ситуации, когда запросы будут проблемой.
Itareo 02.04.2014 08:43 # +1
И да, по поводу выборки ".cont > .node". такая штука не пойдет, потому, что мне нужно знать номер .cont, и еще сам .cont нужен, чтобы с ним кое что сделать.
"Для обычной ХТМЛ страницы не может в принципе быть ситуации, когда запросы будут проблемой."
Для обычной в принципе не может быть. А у меня - приложение с драгндропом, и нужно уметь быстро обновлять координаты всех перетаскиваемых элементов на странице, а их может быть много.
Так же нужно уметь быстро сохранять все дерево элементов, поскольку требуется оперативное автосохранение.
wvxvw 02.04.2014 08:56 # +2
Ну и если этот код выполняется в обработчике события движения мышки - то нахрена делать выборку в этом обработчике? Сделать один раз до и один раз после. Все равно во время движения зажатой мышки пользователь никак структуру документа не поменяет.
Код выше никак не поможет оперативно сохранить все дерево, и ж.квери тут тоже не помощник.
Itareo 02.04.2014 09:18 # +1
roman-kashitsyn 02.04.2014 09:26 # +2
Допустим, вы делаете линейный поиск в массиве.
Обнаружилось, что библиотечных indexOf проигрывает циклу на 20%. А если переписать узкое место сишке, получим ещё выигрыш на 70%. А если запараллелить поиск, то ещё на 40%.
Но тут выясняется, что ищем мы в ответе от базы занных, где правильный where даст гораздо больший performance win.
Itareo 02.04.2014 09:32 # +1
Долгое время, значит, ошибался, думая, что если профит можно получить на отказе от некоторых функций библиотеки, то так по всей библиотеке.
guest 18.04.2014 14:59 # 0