2015-09-07 2 views
3

Я проверил несколько итераций, чтобы проверить эффективность Document.querySelector и Element.querySelector.Почему Document.querySelector эффективнее Element.querySelector

Markup:

<form> 
    <input type="text" /> 
</form> 

Сценарий:

запросов сDocument.querySelector

begin = performance.now(); 

var 
    i = 0, 
    iterations = 999999; 

for (i; i < iterations; i++) 
{ 
element = document.querySelector('[type="text"]'); 
} 

end = performance.now(); 

firstResult = end - begin; 

запросов сElement.querySelector

begin = performance.now(); 

var 
    i = 0, 
    iterations = 999999, 
    form = document.querySelector('form'); 

for (i; i < iterations; i++) 
{ 
element = form.querySelector('[type="text"]'); 
} 

end = performance.now(); 

secondResult = end - begin; 

Вход:

console.log(firstResult); // 703.7450000001118 

console.log(secondResult); // 1088.3349999999627 

журнал удивительно для меня, потому что я думаю, что Element.querySelector запрос только на узлах, который является потомком элемента и Document.querySelector запроса на всех узлах текущий документ, не так ли?

Зачем нужен этот результат?

+0

Если добавить 1000 одноуровневые узлы в форме, вы, вероятно, увидите производительность падения документа поиска уровня. –

+2

Тест [здесь] (http://jsperf.com/document-vs-element-queryselectorall-performance/3) показывает, что ваше утверждение неверно – Tushar

+0

Я не знаю ответа на ваш вопрос, или ваш хороший показатель, но разница в 300 микросекунд за звонок вряд ли кажется чем-то, о чем стоит беспокоиться в реальной жизни. –

ответ

4

Из моего комментария выше, селектор учитывает весь документ, а затем фильтрует элементы, чтобы проверить, являются ли они потомками цели. Поэтому вполне вероятно, что все еще нужно сканировать все дерево DOM, например document.querySelector.

Существует обсуждение проблемы (которая по-прежнему является текущим поведением) here. Вы увидите в примере кода ниже диапазон включается в результате, поскольку он не может просто запрашивать элементы ниже foo в изоляции.

Fiddle

Код:

document.body.innerHTML = '<div><p id="foo"><span></span></p></div>'; 
var foo = document.getElementById('foo'); 
alert(foo.querySelectorAll('div span').length);