2015-02-10 3 views
0

Я пытаюсь найти элемент с:Производительность между doc.querySelectorAll ('# id element') vs doc.querySelector ('# id'). QuerySelectorAll ('element');

doc.querySelectorAll('#divContentList article'); 

Это хорошо работает, но другой разработчик сказал мне, что я должен написать:

doc.querySelector('#divContentList').querySelectorAll('article'); 

Он сказал, что это лучше, потому что идти прямо к #divContentList а затем найдите article элементов.

Я не думаю, что его решение является лучшим в скорости и оно дважды ищет элемент. Я думал, что querySelectorAll достаточно страшна, чтобы выполнять свою работу.

Главный вопрос: какая строка кода лучше всего?

+2

Имеет ли кто-нибудь из вас * проверенный * код? – BoltClock

+0

Вы должны обязательно протестировать его, но 'doc.querySelector ('# divContentList')' определенно будет медленнее, чем '#getElementById()'. – meskobalazs

+1

Это почти наверняка не самая медленная вещь в вашем приложении. Не беспокойтесь об этом. – joews

ответ

0

Вы можете использовать JSPerf для такого рода испытаний ...

Я создал простой тест производительности с прецедентом here, и кажется, что они имеют одинаковую производительность, «единый» querySelector Кажется, что это немного более реалистично несколько раз, но я не думаю, что это будет проблемой в вашем приложении.

+0

Эй, спасибо за эту ссылку. Ты восхитителен! Это будет означать, что есть разница. Написание первого метода меньше второго. В этом случае используйте '# id' и' tagname'. –

+0

yup, возможно, это изменится в зависимости от сложности селектора и количества элементов в DOM. :) –

3

Ответ на этот вопрос является:

  • Метод 1 быстрее
  • Метод 2 быстрее
  • Там нет никакой разницы

Вопрос заключается в том, что ответ может измениться со временем. Поставщики браузеров склонны оптимизировать методы, которые используются много. Если метод 1 используется много, он, скорее всего, будет быстрее или будет быстрее в будущем.

Оба метода кажутся мне равными (с данным вводом). Если есть фундаментальная причина, почему нужно быть быстрее: используйте более быстрый метод.

С вашего первого совпадения идентификатор всегда может быть только одним совпадением.

Если ваш запрос был ".parent .child" и есть много родителей, которые не имеют детей, то ".parent .child"бы, вероятно быстрее, чем (".parent").qsa(".child").

+0

Кажется, существует разница между этими методами. –

1

querySelectorAll оценивает справа налево, поэтому первый найдет все статьи на странице, а затем отфильтрует их до тех, что находятся под divContentList. Я бы сделал getElementById для id, а затем нашел статьи под ним.

Но, как говорили другие, протестируйте его. И протестируйте его в нескольких браузерах.

1

Благодаря Mauricio Soares с его JSPerf первый пример:

<div id="divContentList"> <article></article> </div>

Будет ли на самом деле первый метод:
doc.querySelectorAll('#divContentList article');
быстрее, если есть только ОДИН article в нем.

Я изменил jsPerf с 10, затем до 1000 article, разница в производительности драматична. Check it here

<div id="divContentList"> <article></article> ... <article></article> </div>

это приведет, что второй метод на мой вопрос:
doc.querySelector('#divContentList').querySelectorAll('article');
гораздо быстрее

И наконец, один с помощью getElementById к производительности увеличивается немного больше.
doc.getElementById('divContentList').querySelectorAll('article');
Это лучшее исполнение

Keith Rousseau получил право, что querySelectorAll оценивает справа налево.

Edit:

Также я узнал что-то другое о querySelector и getElementById/getElementsByTagName. querySelector возвращает Static NodeList, а getElementById возвращает Live NodeList.

Я сделал еще один test
document.getElementById('divContentList').getElementsByTagName('article');
Это один берет пирог. Разница смешна

+0

Я обновил тестовый пример с помощью 'articles', которые не находятся в' # divContentList'. Если qsa оценивается справа налево, я ожидаю, что один qsa будет (намного) медленнее, но это не так. Как мы можем это объяснить? – Halcyon

+0

Не знаете, как это объяснить @ Хальцион. Я слышал 4 месяца назад, что браузеры читают CSS справа налево. Так что для qsa, для меня это подтверждение, что оно тоже. Это означает, что вы пишете свой CSS (мышление слева направо) было настолько плохой CSS и повлияло на производительность. Таким образом, наличие более чем 2 селекторов CSS на самом деле плохое. Или определение html-тега, например 'section' || '.main .section' вместо' .main-section'. Заставляет меня думать, что один из них управляет ими. –