Удивительно медленный селектор классов в jQuery по сравнению с getElementsByClassName + Benchmarks - PullRequest
4 голосов
/ 27 июля 2011

Я пишу несколько тестов для CMS, и мне нужно знать, есть ли определенное имя класса в документе.

Итак, я решил выяснить, какой самый быстрый способ проверить, существует ли имя класса в документе. Вы можете увидеть мои тесты здесь: http://jsperf.com/if-class-exists

Если вы запустите тест, вы увидите, что getElementsByClassName является самым быстрым (99%). Это заставило меня задуматься, проверяет ли даже jQuery, есть ли собственный селектор классов.

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

1 Ответ

4 голосов
/ 27 июля 2011

Я думаю, что вы уже ответили на свой вопрос с помощью jsperf. Если скорость действительно важна для вас в конкретной операции, и этот тест является верным показателем того, что вам нужно, то проведите свой собственный тест для getElementsByClassName и используйте его, если он доступен, так как он показывает в 400 раз быстрее в вашем jsperf.

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

Согласно этому документу , jQuery должен использовать getElementsByClassName для простого селектора класса.

Редактировать: Я прошел через этот вызов функции в jQuery $('.select'). Он использует getElementsByClassName для внутреннего использования, но есть много накладных расходов, прежде чем он туда попадет (включая даже выполнение сложного регулярного выражения) из-за невероятной общей природы jQuery (он должен проверить множество вещей, прежде чем выяснить, что вам нужно простой селектор имени класса).

Я думал, что если вы добавите большой DOM к своему jsPerf, разрыв в производительности может сузиться, потому что накладные расходы на установку jQuery будут намного меньшей частью общего времени выполнения, но я не вижу особых изменений. getElementsByClassName('.selector'), вызываемый сам по себе, просто намного быстрее, чем jQuery('.selector').

...