2009-08-05 6 views
16

Nie jestem pewien, czy użyć :first lub :eq(0) w selektorze. Jestem prawie pewien, że zawsze zwrócą ten sam obiekt, ale są szybsze od innych?Czy jQuery's: selektory pierwszy i: eq (0) są funkcjonalnie równoważne?

Jestem pewna, że ​​ktoś tutaj musiał wcześniej przetestować te selektory i nie jestem naprawdę pewien, jak najlepiej sprawdzić, czy jest on szybszy.

Aktualizacja: oto ławka Pobiegłem:

/* start bench */ 
for (var count = 0; count < 5; count++) { 
    var i = 0, limit = 10000; 
    var start, end; 
    start = new Date(); 
    for (i = 0; i < limit; i++) { 
     var $radeditor = $thisFrame.parents("div.RadEditor.Telerik:eq(0)"); 
    } 
    end = new Date(); 
    alert("div.RadEditor.Telerik:eq(0) : " + (end-start)); 
    var start = new Date(); 
    for (i = 0; i < limit; i++) { 
     var $radeditor = $thisFrame.parents("div.RadEditor.Telerik:first"); 
    } 
    end = new Date(); 
    alert("div.RadEditor.Telerik:first : " + (end-start)); 
    start = new Date(); 
    for (i = 0; i < limit; i++) { 
     var radeditor = $thisFrame.parents("div.RadEditor.Telerik")[0]; 
    } 
    end = new Date(); 
    alert("(div.RadEditor.Telerik)[0] : " + (end-start)); 
    start = new Date(); 
    for (i = 0; i < limit; i++) { 
     var $radeditor = $($thisFrame.parents("div.RadEditor.Telerik")[0]); 
    } 
    end = new Date(); 
    alert("$((div.RadEditor.Telerik)[0]) : " + (end-start)); 
} 
/* end bench */ 

Przypuszczałem, że 3. byłby najszybszy i 4. byłoby najwolniej, ale oto wyniki, które wymyśliłem:

FF3: :eq(0) :first [0] $([0]) 
trial1 5275 4360 4107 3910 
trial2 5175 5231 3916 4134 
trial3 5317 5589 4670 4350 
trial4 5754 4829 3988 4610 
trial5 4771 6019 4669 4803 
Average 5258.4 5205.6 4270 4361.4 

IE6: :eq(0) :first [0] $([0]) 
trial1 13796 15733 12202 14014 
trial2 14186 13905 12749 11546 
trial3 12249 14281 13421 12109 
trial4 14984 15015 11718 13421 
trial5 16015 13187 11578 10984 
Average 14246 14424.2 12333.6 12414.8 

Miałem rację, właśnie zwracając pierwszy rodzimy obiekt DOM będący najszybszym ([0]), ale nie mogę uwierzyć, że zawijanie tego obiektu w funkcji jQuery było szybsze niż oba :first i :eq(0)!

O ile nie robię tego źle.

Odpowiedz

6

Dobre pytanie, świetny post. Testowałem to jakiś czas temu i nie mogłem zapamiętać dokładnego wyniku. Naprawdę się cieszę, że to znalazłem, ponieważ właśnie tego szukałem.

Zgaduję, że powód, dla którego :first i :eq(0) jest odrobinę wolniejszy, jest najprawdopodobniej związany z wydajnością analizowania. Pominięcie tych opcji umożliwia silnikowi jQuery korzystanie z natywnych funkcji getElementsByTagName i getElementsByClassName.

Bez niespodzianek i.t.o. element DOM jest najszybszy do uzyskania. Zawijanie elementu DOM za pomocą jQuery w pętli dla niekoniecznie będzie miało niekorzystny wpływ na wydajność, ponieważ jQuery używa właściwości expando do celów buforowania.

Jednak byłoby ciekawie zobaczyć, jak porównanie get(0) z dostępem do elementu DOM i jak owijanie jQuery taryfy przeciwko eq(0) i resztę wyników.

5

Tak, są one równoważne.

Nie, prawdopodobnie nie różnią się znacząco (cokolwiek innego to mikrooptymalizacja).

12

Według kodu źródłowego jQuery, .first() tylko wrapper wygoda dla .eq(0):

first: function() { 
    return this.eq(0); 
}, 
+1

ta powinna być przyjęta odpowiedź. –

Powiązane problemy