Dobre sposoby na poprawę wydajności selektora jQuery?

Szukam sposobu na poprawienie wydajności selektora wywołania jQuery. Dokładnie takie rzeczy:

Is $("div.myclass") faster than $(".myclass")

Myślę, że może być, ale nie wiem, czy jQuery jest wystarczająco inteligentny, aby ograniczyć wyszukiwanie po nazwie tagu, itp. Ma ktoś jakiś pomysł jak sformułować ciąg selektora jQuery dla najlepszej wydajności?

Author: Gordon Gustafson, 2008-09-05

12 answers

Nie ma wątpliwości, że filtrowanie po nazwie znacznika jest znacznie szybsze niż filtrowanie po nazwie klasy.

Będzie tak dopóki wszystkie przeglądarki nie zaimplementują getElementsByClassName natywnie, tak jak ma to miejsce w przypadku getElementsByTagName.

 36
Author: kamens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-05 16:39:39

W niektórych przypadkach można przyspieszyć zapytanie, ograniczając jego kontekst. Jeśli masz odniesienie do elementu, możesz przekazać je jako drugi argument, aby ograniczyć zakres zapytania:

$(".myclass", a_DOM_element);

Powinien być szybszy niż

$(".myclass");

Jeśli masz już a_DOM_element i jest on znacznie mniejszy niż cały dokument.

 14
Author: Matthew Crumley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-20 01:16:19

Jak wspomniano powyżej jQuery działa od dołu do góry. Chociaż

To znaczy $('#foo bar div') jest lot wolniejszy niż $('bar div #foo')

Nie o to chodzi. Gdybyś miał #foo to i tak byś nic przed nim nie wstawił do selektora, bo identyfikatory muszą być unikalne.

Chodzi o to:

  • jeśli podzelectujesz cokolwiek z elementu o ID, wybierz najpierw "later", a następnie użyj .find, .children itd.: $('#foo').find('div')
  • twoja lewa (pierwsza) część z selektora Może być mniej wydajne skalowanie do najbardziej prawej (ostatniej) części, która powinna być najbardziej efektywna - to znaczy jeśli nie masz ID upewnij się, że szukasz $('div.common[slow*=Search] input.rare') zamiast $('div.rare input.common[name*=slowSearch]') - ponieważ nie zawsze ma to zastosowanie upewnij się, że wymusisz kolejność selektora dzieląc odpowiednio.
 5
Author: Philipp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-06 15:11:57

Aby w pełni zrozumieć, co jest szybsze, musisz zrozumieć, jak działa parser CSS.

Selektor zostanie podzielony na rozpoznawalne części za pomocą wyrażenia regularnego, a następnie przetworzony kawałek po kawałku.

Niektóre selektory, takie jak ID i TagName, używają natywnej implementacji przeglądarki, która jest szybsza. Podczas gdy inne, takie jak klasa i atrybuty, są programowane oddzielnie i dlatego są znacznie wolniejsze, wymagając zapętlenia wybranych elementów i sprawdzenia każdej klasy nazwisko.

Więc tak, aby odpowiedzieć na twoje pytanie:

$('tag.class') jest szybsza niż tylko $('.class"). Dlaczego? W pierwszym przypadku jQuery wykorzystuje natywną implementację przeglądarki, aby odfiltrować wybór do tylko potrzebnych elementów. Dopiero wtedy uruchamia wolniej .Implementacja klasy filtruje to, o co prosiłeś.

W drugim przypadku jQuery używa swojej metody do filtrowania każdego elementu za pomocą klasy grabbing.

To rozprzestrzenia się dalej niż jQuery jak wszystkie bazują na tym biblioteki javascript. Jedyną inną opcją jest użycie xPath, ale obecnie nie jest ona zbyt dobrze obsługiwana przez wszystkie przeglądarki.

 5
Author: Dmitri Farkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-13 17:37:11

Oto jak zwiększyć wydajność selektorów jQuery:

 4
Author: jQuery Lover,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-06 11:13:23

Dodam uwagę, że w 99% aplikacji internetowych, nawet ciężkich aplikacji ajax, szybkość połączenia i odpowiedź serwera www będzie napędzać wydajność aplikacji, a nie javascript. Nie mówię, że powinieneś pisać celowo powolny kod lub że ogólnie świadomość tego, co może być szybsze niż inne, nie jest dobra.

Ale zastanawiam się, czy próbujesz rozwiązać problem, który tak naprawdę jeszcze nie istnieje, czy nawet jeśli optymalizujesz coś, co może zmienić w najbliższej przyszłości (powiedzmy, jeśli więcej osób zacznie korzystać z przeglądarki obsługującej funkcję getElementsByClassName(), o której mowa wcześniej), dzięki czemu zoptymalizowany kod będzie działał wolniej.

 3
Author: Joel Coehoorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-20 15:37:06

Kolejnym miejscem, w którym można szukać informacji o wydajności, jest strona Hugo Vidal Teixeira z analizą wydajności selektorów.

Http://www.componenthouse.com/article-19

Daje to dobry przebieg prędkości selektora według id, selektora według klasy i nazwy znacznika prefiksu selektora.

Najszybszy selektor po id to: $("#id")

Najszybszy selektor po klasie to: $('tag.class")

Więc prefiks po tagu pomógł tylko przy wyborze po klasie!

 3
Author: Evan Moran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-20 00:45:20

Byłem na niektórych listach dyskusyjnych jQuery i z tego, co tam czytałem, najprawdopodobniej filtrują według nazwy tagu, a następnie nazwy klasy (lub odwrotnie, jeśli była szybsza). Mają obsesję na punkcie szybkości i użyliby wszystkiego, aby uzyskać odrobinę wydajności.

Naprawdę nie martwiłbym się o to zbytnio, chyba że uruchamiasz selektor tysiące razy / SEK.

Jeśli jesteś naprawdę zaniepokojony, spróbuj zrobić jakiś benchmarking i zobaczyć, który jest szybszy.

 0
Author: Ryan Doherty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-05 16:32:25

Rozważ użycie biblioteki sekwencyjnej Olivera Steele ' a do wywoływania metod w czasie zamiast wszystkich naraz.

Http://osteele.com/sources/javascript/sequentially/

Metoda "ostatecznie" pomaga wywołać metodę po pewnym czasie od jej pierwszego wywołania. Metoda "sekwencyjnie" umożliwia kolejkowanie kilku zadań w określonym czasie.

Bardzo pomocny!

 0
Author: Evan Moran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-20 00:36:28

A świetna wskazówka z pytania, które zadałem: używaj standardowych selektorów CSS wszędzie tam, gdzie to możliwe. Pozwala to jQuery używać API selektorów . Zgodnie z testami przeprowadzonymi przez Johna Resiga , daje to prawie natywną wydajność dla selektorów. Należy unikać takich funkcji jak :has() i :contains().

Z moich badań wynika, że wsparcie dla API selektorów zostało wprowadzone z jQuery 1.2.7, Firefox 3.1, IE 8, Opera 10, Safari 3.1.

 0
Author: Alex Angas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:32:56

Jeśli się nie mylę, jQuery jest również silnikiem oddolnym. Oznacza to, że $('#foo bar div') jest dużo wolniejszy niż $('bar div #foo'). Na przykład, $('#foo a') przejrzy wszystkie elementy a na stronie i sprawdzi, czy mają przodka #foo, co sprawia, że Selektor jest niezwykle nieefektywny.

Resig może już zoptymalizowany pod ten scenariusz (nie zdziwiłbym się , gdyby to zrobił-wierzę, że zrobił w swoim silniku Sizzle, ale nie jestem w 100% pewien.)

 0
Author: Reid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-14 03:39:33

Uważam, że wybranie najpierw ID jest zawsze szybsze:

$("#myform th").css("color","red");

Powinien być szybszy niż

$("th").css("color","red");

Zastanawiam się jednak, na ile chaining pomaga przy rozpoczynaniu od ID? Czy to

$("#myform").find("th").css("color","red")
.end().find("td").css("color","blue");
Szybciej niż to?
$("#myform th").css("color","red");
$("#myform td").css("color","blue");
 0
Author: Lawrence,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-12 23:59:01