Является ли document.links быстрее при поиске ссылки с помощью jQuery? - PullRequest
2 голосов
/ 01 апреля 2010

Это быстрее:

$(document.links).filter('a.someClass')

чем просто старый это:

$('a.someClass')

Я не вижу нигде в коде jQuery использования document.links
который дает вам коллекцию ссылок на документ сразу,
чем, казалось бы, быстрее будет просто отфильтровать коллекцию
вместо всех DOM-узлов, а это значит, что нужно перебрать больше узлов.

Ответы [ 5 ]

8 голосов
/ 01 апреля 2010

Я только что выполнил тест, 1000 раз запустил селектор в Chrome.

$(document.links).filter('a.someClass') потребовалось 672 мсек для запуска 1000 раз.

$('a.someClass') потребовалось 191 мсек для запуска 1000 раз.

Если вы делаете

$('a').filter('.someClass') однако, для запуска требуется 652 мс; так что filter кажется, что время потеряно.

var x = $('.remove', document.links); по совпадению, заняло 13 секунд; так что лучше не использовать этот вариант: P

4 голосов
/ 01 апреля 2010

Теоретически, итерация document.links будет немного быстрее, чем библиотека выбора Sizzle в jQuery. Однако:

  • не так, как вы делаете это с filter, что дает jQuery столько же работы, сколько нужно было бы, используя Sizzle, чтобы выбрать элементы в первую очередь;

  • document.links не обязательно даст вам то же самое, что и $('a'), так как a-без-href не появляется в коллекции links.

  • прямой метод $('a.someClass') будет намного быстрее, чем даже повторение вручную document.links в современных браузерах, потому что этот метод просто передаст управление собственной реализации браузера document.querySelectorAll('a.someClass'), что будет намного быстрее, чем все, что могли бы сделать вы или Sizzle, нюхая DOM-узлы.

(Есть один немного более быстрый метод, чем querySelectorAll, который jQuery еще не использует: document.getElementsByClassName('someClass'). Опять же, это только в современных браузерах, и IE8 не имеет его там, где он имеет querySelectorAll На практике это, вероятно, не стоит слишком беспокоиться, поскольку querySelectorAll уже очень быстр.)

1 голос
/ 01 апреля 2010

Не надо угадывать JQuery. Многие люди потратили много времени, чтобы сделать это быстро. Если бы document.links был хорошим способом найти теги <a>, то Sizzle сделал бы это автоматически для вас.

Тем не менее (ну, набрал), определенно лучше сделать это:

$('a.someClass')

чем

$('.someClass')

Когда вы можете квалифицировать своих селекторов по имени тега, вам лучше. Движок будет использовать getElementsByTagName(), чтобы сократить количество сканируемых узлов.

0 голосов
/ 01 апреля 2010

Я только что провел тест здесь: http://jsbin.com/ixiva3

1000 ссылок были созданы динамически. этот тест требует firebug (используя console.time)

Результаты показывают, что $("a.somelink") является самым быстрым.

0 голосов
/ 01 апреля 2010

Я не знаком с тем, как работает библиотека селектора sizzle, но я подозреваю, что когда вы выполните $('a.someclass'), jQuery будет извлекать все якоря, используя что-то вроде document.getElementByTagName('A'), а не обходить весь DOM.

Как говорит Пойнти, sizzle очень быстрый и высоко оптимизированный, лучший способ выяснить, что лучше, - запустить собственные тесты

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...