2013-06-05 12 views
7

Testowałem różnice między 2 selektorów ID, pierwsza jest normalne: $('#lol') A druga jest taka sama, ale umieszczone pomiędzy wieloma nawiasie: $((((('#lol')))))jQuery wydajność selektor: ciekawy przypadek

uruchomiłem test na jsperf, z firefoxem i chromem. Wyniki są interesujące: Z firefox, pierwszy (selektor normalny) jest o 40% wolniejszy (!!!). W przypadku chrome drugi jest wolniejszy o 0,84%.

Dlaczego taka różnica? Czy ktoś może to wyjaśnić?

Czy jsperf.com jest niezawodny?

Można zobaczyć test tutaj:

http://jsperf.com/ghshshsrd

będę testować na innych przeglądarek, dla zabawy.

(Edit: Jestem na Mac OS X, przy okazji)

+0

Testowane również z operą i safari, bez rzeczywistych różnic. Tylko Firefox ma ten dziwny wynik – FLX

+1

nie, jeśli uruchomisz test z przeglądarki Firefox, dla mnie oba są podobne –

+0

Myślę, że rzutowany wynik pokazany na wykresie jest sprawcą –

Odpowiedz

2

Jak inni zwrócili uwagę, różnice między wynikami uzyskanymi dla dwóch stwierdzeń jest znikoma. Nawet gdy testing the same statement twice, jest bardzo mało prawdopodobne, że uzyskasz dwie identyczne wartości Ops/s.

Zauważyłem również, że powiedziałeś "test", a nie "testy wielokrotne". Jeśli wynik wydawał się dziwny, po prostu powtórz test - nie zapomnij o anomalnych wynikach, jeśli twoja przeglądarka została pozbawiona zasobów przez część testu.

JSPerf zawsze był dla mnie niezawodny - wystarczający do wykazania technik optymalizacji (this being a classic example).

0

W rzeczywistości nie ma rzeczywistej różnicy między obydwoma sposobami wyboru elementu (z wyjątkiem czytelności). stworzyłem nowy przypadek testowy jsperf który bardziej obiektywnie mierzy postępowania:

->http://jsperf.com/jquery-selector-performance-20130730

Dlaczego Twój test-wynik jest więc dziwne? Bardziej prawdopodobne jest, że Twój scenariusz testowy jest niedokładny, niż jakakolwiek realna różnica w wydajności między obydwoma testami.

Możesz przejść i ODWRÓĆ kolejność testowania początkowego testu: najpierw sprawdź kod $(((('#lol')))), a następnie $('#lol'). Jestem przekonany, że otrzymasz dokładnie odwrotny wynik twojego aktualnego testu ;-)

Nie jestem ekspertem od tego, ale z jednej strony, przeglądarki są dziś bardzo inteligentne i będą buforować kod/zmienne javascript . Również jQuery prawdopodobnie zapisze wartość po pierwszym wywołaniu.