Przewiń w dół, aby porównać z getById.getByClassName
vs. qSA
!
Gdybyśmy chcieli wybrać wszystkie elementy klasy "bar"
które są wewnątrz elementu z ID "foo"
, możemy napisać tak:
$('#foo .bar')
lub to:
$('.bar', '#foo')
Nie są oczywiście inne metody, aby to osiągnąć, ale ze względu na to pytanie, porównajmy tylko te dwie metody.
Które z powyższych metod działają lepiej? (Który potrzebuje mniej czasu na wykonanie?)
Pisałem ten test wydajności:
(function() {
var i;
console.time('test1');
for(i = 0; i < 100; i++) {
$('#question-mini-list .tags');
}
console.timeEnd('test1');
console.time('test2');
for(i = 0; i < 100; i++) {
$('.tags', '#question-mini-list');
}
console.timeEnd('test2');
})();
trzeba wykonać ją od wewnątrz konsoli na przepełnienie stosu w uruchomienia strony. Moje wyniki to:
Firefox:
test1: ~ 90ms
test2: ~ 18ms
Chrome:
test1: ~ 65ms
test2: ~ 30ms
Opera:
test1: ~ 50ms
test2: ~ 100ms
Tak więc w Firefox i Chrome, t Druga metoda jest wielokrotnie szybsza - tak jak się spodziewałem. Jednak w Operze sytuacja jest odwrotna. Zastanawiam się, co tu się dzieje.
Czy możesz przeprowadzić test na swoim komputerze i wyjaśnić, dlaczego Opera działa inaczej?
Aktualizacja
pisałem ten test, w celu zbadania, czy Opery QSA naprawdę jest super szybki. Jak się okazuje, jest.
(function() {
var i, limit = 5000, test1 = 'test1', test2 = 'test2';
console.time(test1);
for(i = 0; i < limit; i += 1) {
document.getElementById('question-mini-list').getElementsByClassName('tags');
}
console.timeEnd(test1);
console.time(test2);
for(i = 0; i < limit; i += 1) {
document.querySelectorAll('#question-mini-list .tags');
}
console.timeEnd(test2);
})();
Ponownie, należy uruchomić ten kod z poziomu konsoli na stronie początkowej stosu przepełnienia. Użyłem bookmarkletu Firebug Lite dla IE9 (ponieważ ta przeglądarka nie implementuje console.time
).
Więc porównałem tą metodą:
document.getelementById('A').getElementsByClassName('B');
do tej metody:
document.querySelectorAll('#A .B');
Mam wykonywany Powyższy skrypt pięć razy z rzędu w każdej przeglądarce.Średnie arytmetyczne to:
(wszystkie liczby są w milisekundach).
Więc, wydajność pierwszej metody jest prawie taka sama w testowanych przeglądarek (16-36ms). Jednak, podczas gdy qSA jest znacznie wolniejsza w porównaniu do pierwszej metody, w Operze jest w rzeczywistości szybsza!
Tak, optymalizacja QSA jest możliwe, zastanawiam się, co innych przeglądarek czekają na ...
'test1: 73ms',' test2: 11ms'. Opera jest dziwną przeglądarką, nie jestem pewna, dlaczego to się opóźnia. – Blender
@Blender Proszę zwiększyć limit pętli. Mój laptop jest naprawdę powolny, więc poszedłem ze 100. Spróbuj 1000.(Wyniki mniejsze niż '4ms' nie są wiarygodne ...) –
Czy rozważałeś włączenie' document.getElementById ('foo'). GetElementsByClassName ('bar') 'dla kompletności? – RobG