Porównanie wydajności frameworków JS
04 lipca, 2007
Wiele razy w sieci spotykałem się z twierdzeniami, że jQuery jest o wiele szybsze od mootools... Nie ukrywam, że nawet już się chciałem z tym faktem pogodzić, ale nic bardziej mylnego... Na blogu jQuery pojawił się wpis z okazji wydania wersji 1.1.3 i pojawiło się wraz z nim porównanie wydajności jQuery i innych frameworków JS. Jeżeli obejrzycie tabelki to z pewnością się lekko zdziwią zwłaszcza zwolennicy tezy o wyższości jQuery nad mootools w kwestii wydajności ;) Ale nie byłbym sobą gdybym nie przeprowadził tego samego testu u siebie ... Zmieniła się jednak testowana ekipa i lekkiej zmianie uległ zestaw przeglądarek - Safari 2 jest u mnie zastąpione Safari 3.0.2 dla Windows.
Zapraszam na moją analizę uzyskanych wyników ;) Gdyby ktoś chciał sobie sam przeprowadzić ten test to zapraszam pod ten adres.
O co w ogóle chodzi i jak przebiegał test
Zacznijmy w ogóle od tego o co w tym teście chodzi. W teście został użyty skrypt SlickSpeed. Test został przeprowadzony na moim wysłużonym komputerze (Celeron 533MHz, 256MB SDRAM - to w sumie wystarczy ;] ). Użyłem czterech przeglądarek - IE6, Opery 9.2, FIrefoxa 2.0.0.4 oraz wspomnianego Safari 3.0.2 . W czasie testu by uniknąć jakichś zakłóceń wyłączyłem wszelkie zbędne programy (komunikatory, i inne otwarte okna) i wyszedłem na herbatę by zbędnie nie ruszać myszką ;D
Test sprawdza wydajność frameworków JS w zakresie selekcji elementów z testowego dokumentu. Selekcja elementów z drzewa dokumentu to właściwie podstawa działania jakichkolwiek większych skryptów JS i od niej w dużym stopniu zależy wydajność skryptu.
Wyniki
Bez zbędnych ceregieli przejdę do samych wyników - zamieszczam screeny uzyskanych rezultatów gdyż mam świadomość, że nie każdy ma czas na testowanie tego wszystkiego u siebie ;)
Dodać należy, że użyłem najnowszego jQuery (spakowanego i niespakowanego) oraz mootools 1.11 (kompresowanego z użyciem JSMin i skryptu PHP) oraz najnowszego mootools z SVN dostępnego w dniu testów(test robiłem parę dni temu więc jest już nowsza wersja mootools z SVN). Dodatkowo zostawiłem standardowe frameworki dostarczone ze skryptem do testów.
O rezultatach
Wnioski jakie wyciągnąłem z prezentowanych rezultatów:
- Zdecydowanie najwolniejszy z całej stawki jest cssQuery - jest wielokrotnie wolniejszy od czołówki.
- Mootools 1.11 nie obsługuje sporej ilości selektorów - w najnowszym Mootools nastąpiła w tej kwestii ogromna poprawa.
- Jedyne frameworki jakie obsługują wszystkie selektory to prototype i jQuery z tym, że pod IE proptotype pada w dwóch selektorach - a więc jeśli chodzi o kompatybilność z przeglądarkami i obsługę selektorów jQuery jest zdecydowanym liderem.
- Największe rozbieżności w ilości wyselekcjonowanych elementów występują w IE (17 selektorów), a najmniejsze w Operze (12 selektorów) - Firefox i Safari - 13 selektorów...
- Najszybciej w testach wypadają Safari i Opera - Firefox odstaje od nich dość znacznie, a IE wypada wręcz tragicznie (80 sekund na cały test dla cssQuery mówi samo za siebie).
- W Operze widać dość znaczne różnice pomiędzy wersjami upakowanymi i tymi mniej upchanymi jeśli chodzi o jQuery i mootools. Na pozostałych przeglądarkach nie widać tak znacznych różnic.
- Mootools w najnowszej wersji jest szybszy od jQuery we wszystkich przeglądarkach poza IE, gdzie jQuery jest prawie dwa razy szybsze. Celowo nie porównuję tutaj mootools 1.11 z jQuery ponieważ nie zwraca ono wyników ze zbyt wielu selektorów co ma dość znaczny wpływ na końcowy wynik.
- Prototype ma zbliżone rezultaty do mootools. Na Safari i Operze jest nawet wyraźnie szybsze.
Podsumowanie
Przede wszystkim wyniki w znacznym stopniu pokrywają się jeśli chodzi o ranking z wynikami prezentowanymi na blogu jQuery - różnice występują tylko u mnie w IE - Dojo jest szybsze od jQuery, ale pomija parę selektorów więc można uznać jQuery za lidera . W safari 3 wyraźnemu przyśpieszeniu uległa praca mootools i prototype - oba prześcignęły jQuery.
Widać wyraźnie, że każdy z frameworków ma swoje mocne i słabsze strony - poza cssQuery, który bardzo odstaje od reszty. jQuery obsługuje wszystkie selektory, ale jest dwa razy wolniejsze od najnowszego mootools pod Firefoksem i Operą (pod Operą właściwie 1.5 raza). Prototype, dojo i ext też całkiem przyzwoicie się prezentują i momentami prześcigają i mootools i jQuery.
Reasumując - twierdzenie, że jQuery jest o wiele wydajniejsze od mootools jest nie do końca prawdą (poza IE) i moim zdaniem nie powinno się go stosować jako argumentu do przekonywania ludzi do danej biblioteki... Jaka jest dobra wiadomość ? Widać, że jest kilka frameworków, które mieszczą się w granicach przyzwoitości jeśli chodzi o wydajność, a co za tym idzie mamy szeroki wybór narzędzi wspomagających pisanie nierzadko całych aplikacji w JS. Nie musimy się przy tym obawiać, że bardzo dużo stracimy na wydajności w stosunku do innych frameworków (poza cssQuery ;) ).
Komentarze do wpisu "Porównanie wydajności frameworków JS":
1.
muffy napisał(a):
04 lipca 2007, 17:29:39
Brawa za test i wytrwałość ;-)
Swoją drogą, ostatnio z kumplem poruszyliśmy ten temat (tj. frameworki JS) i byliśmy przekonani, że jQuery jest wymiataczem, jeżeli chodzi o wydajność, a tu ciekawa niespodzianka ;-) I na co się tu zdecydować ?
Pozdrawiam
2.
Nero napisał(a):
04 lipca 2007, 18:54:10
[ tym kolega bylem ja xD ]
Jquery ma wg mnie jedna bardzo powazna wade – nie mozna go mieszac ze zwyklym JSem.
czyli:
mojElement.$(xxx)
document.getElementsByTagName(xxx).$(xxx)
itp. nie zadzialaja
W mootools widze ze niby takiego czegos tez niezaimplementowano (podejrzewam ze to jest trudno/niemozliwe) ale sa nowe funkcje ktore wykonuja to samo ale mozna je juz mieszac. Bardzo mi tego w jquery brakuje. Artykul bardzo dobry, przecietny uzytkownik i tak pewnie nie zauwazy roznicy miedzy liderami ale programiscie daje do myslenia.
3.
Dziudek napisał(a):
04 lipca 2007, 19:52:57
@muffy – ja tam bym się cieszył, bo mamy szeroki wybór rozwiązań ;] Każdy może wybrać framework, który będzie mu pasował wiedząc, że nie ma się co bać o wydajność. Zwróć uwagę na to, że twórcy jQuery piszą o wzroście wydajności o blisko 800% – to teraz sobie wyobraź jak zachwalany za wydajność jQuery w wersji 1.1.2 by wypadł nawet przy mootools 1.11 :) Bo mootools za bardzo nie przyśpieszył w najnowszej wersji tylko po prostu obsługuje więcej ;)
@Nero – nie bardzo widzę sens mieszania zwykłego JS i kodu frameworka – można sobie zafundować tylko niezły bałagan – mootools ma tyle funkcji i metod w klasach, że większość kodu daje się napisać tylko z użyciem mootools ;)
4.
D4rky napisał(a):
04 lipca 2007, 20:19:49
pod IE proptotype pada w dwóch selektorach pod IE
Kononowicz ;)
5.
Dziudek napisał(a):
04 lipca 2007, 20:23:23
@D4rky – ano zdarza się mi kononowiczować ;D Poprawione ;]
6.
D4rky napisał(a):
04 lipca 2007, 20:23:58
Dziudek – to normalne gdy przerywasz tok myślenia w połowie zdania, też tak mam ;)
7.
Dziudek napisał(a):
04 lipca 2007, 20:25:23
@D4rky – ten wpis powstawał częściowo o 4 nad ranem, a częściowo po 4 godzinach snu ;D Myślę, że jak na ten stan rzeczy nie jest źle ;)
8.
Nero napisał(a):
04 lipca 2007, 21:11:03
@dziudek -> problem w tym ze jquery nie udostepnia takich intuicyjnych funkcji, a mootools tak.
9.
Dziudek napisał(a):
04 lipca 2007, 21:11:51
@Nero – no to już wiesz dlaczego wybrałem mootools ;]
10.
Riddle napisał(a):
05 lipca 2007, 17:43:15
Selektory CSS selektorami, opinia że jQuery jest szybsze bazuje nie tyle na nich, co na ilości kodu jaką zwykle trzeba napisać oraz szybkości wybranych rozwiązań (metod) od autorskich.
Z szybkością frameworków jest jak z ilością koni w samochodach. Ani jedno ani drugie nie pozwala w pełni przekonać się co jest dla nas lepsze.
11.
Dziudek napisał(a):
05 lipca 2007, 17:52:34
@Riddle – wiadomo, że sam test mierzący szybkość selekcji elementów nie mówi wszystkiego o wydajności danego frameworka, ale już wiele znaczy, bo jednak selekcja elementów to z reguły podstawa działania większości skryptów. Wiadomo, że jQuery pozwala na zminimalizowanie ilości kodu JS, ale powoduje też moim zdaniem, że taki kod traci sporo na czytelności – bo zapis w postaci jednego znaczka, a metoda addEvent dla kogoś, kto nie zna frameworka robi różnicę ;) Mnie osobiście jakoś nie przeszkadza, że używając mootools muszę napisać trochę więcej kodu niźli za pomocą jQuery, bo wiem, że kod zapisany w mootools już sam w sobie nie wymaga komentarza…
A co do tego co dla nas lepsze – po wynikach testu widać, że śmiało można wybierać pomiędzy kilkoma frameworkami – w zależności od tego kto co lubi ;)
12.
Nero napisał(a):
06 lipca 2007, 09:29:12
No i wlasnie :) kazdy wybierze to co chce. Ja sie przerzucilem na mootoolsy bo jak napisalem, Jquery nie jest dla mnie intuicyjne. I po pierwszych dniach pisania jestem zadowolony. Ostatnio w Jquery zauwazylem (moze to tez normalnie ale wydaje mi sie ze tylko w jquery) ze przy zastosowaniu zamiennych onclików (np. tak jak ja teraz mialem): – kliknij, wywolaj show() i zmien onclick na hide() – kliknij, wywolaj hide() i zmien onclick na show()
To po 3-4 krotnej przemianie kod juz makabrycznie zamula, za kazdym klikiem gorzej. Wczesniej w zwyklym JS-ie bylo ok, teraz przerobilem to na funkcje showToggle() ale to nie zmienia faktu ze w jquery sie wieszalo.
13.
Bigismall napisał(a):
06 lipca 2007, 09:37:13
Dzięki za Test i porównanie. Do mnie również bardziej przemawia mmootools ze względu na składnię własnie.
14.
Rafał 'RaVbaker' Piekarski napisał(a):
14 lipca 2007, 02:40:46
W pracy używamy MooToolsów i zauważamy dziwną ich zdolność do „wieszania się”. I co ciekawe, częściej to się zdarza na wersji skompresowanej. Przyczyny błędu jeszcze nie znaleźliśmy. I byłem gotów nawet przysiądz, że to wina samego frameworka i, że ta „krowa”, która w czystej postaci ma ponad 180kB kodu po prostu gdzieś ma jakiś błąd. No ale przyczyna chyba leży gdzieś indziej.
Ale w sumie co się dziwić, gdy strona ma kilkaset kilobajtów kodu, z czego 70% to JS. ;-)
No ale ten test i wpis, jak i ten z blog jQuery, tylko mnie utwierdził, że używamy właściwego narzędzia.
Winę zapewne ponosi FF i jego rozszerzenia. :P
15.
Dziudek napisał(a):
14 lipca 2007, 02:46:24
@RaVbaker – ja też zauważyłem takie zachowanie, bo też używam przy pracy mootools – oczywiście tylko na Firefoksie to mi się zdarza ;) Powiem tak – prawdopodobnie przyczyna leży w tym, że przeglądarka musi „odszyfrować” cały kod, w wolnym czasie zamierzam zacząć używać wersji pakowanej za pomocą JSMin – różnicy wydajności właściwie nie ma poza Operą ;) No i oczywiście najlepiej używać Packito przy projektach – wtedy mnóstwo kodu odpadnie ;)
16.
RaVbaker napisał(a):
14 lipca 2007, 02:55:37
Póki co zaczęliśmy stosować wersję nieskompresowaną i nie ma zwisów (zbyt często). Spróbujemy z JSMin i jakby co, to dam znać jakie wyniki. ;-)
17.
Dziudek napisał(a):
14 lipca 2007, 02:59:53
@RaVbaker – no wydaje mi się, że poza różnicą w rozmiarze to wszystko skompresowane za pomocą JSMin powinno działać ok ;) To jest ten sam kod przecież tylko bez białych znaków i komentarzy ;) Wersja nieskompresowana niczym wydaje mi się dobra jedynie wtedy gdy wprowadza się własne modyfikacje do kodu mootools ;) W każdym razie czekam na informację co do ilości „zwisów” ;) Swoją drogą to najlepiej to testować na stronie gdzie nie ma innego kodu JS poza mootools – bo winę może ponosić nie mootools tylko jakaś słabo zoptymalizowana część kodu ;)
18.
RaVbaker napisał(a):
14 lipca 2007, 03:02:07
Ale z drugiej strony przecież liczy się właśnie finalna aplikacja, i nieważne ile innych JSów tam include’ujesz. Klienta/użytkownika to nie obchodzi. Chce mieć sprawny i pozbawiony błedów/wad produkt. A naszym (programistów) zdaniem jest to zrobić.
19.
Off napisał(a):
14 lipca 2007, 16:25:38
Ładny wpis Dziudek ;) Zdecydowanie jestem bardziej przekonany za mootoolsem. jQuery przy większej ilości kodu się wiesza (em calc riddle’a). Bardzo fajny przykład z tym, że kod mootools sam w sobie jest komentarzem. W jQuery trzeba znać funkcje na pamięć a w mootools kod jest inuicyjny. Wyższość jQuery, polega na tym, że niektóre funckje zapisane są w dwa-trzy znaki mniej.
20.
Riddle napisał(a):
14 lipca 2007, 16:26:35
Em Calc sie wiesza bo ssalem w jQuery jak go pisalem.
21.
Off napisał(a):
14 lipca 2007, 16:48:20
A teraz chciałbyś się przenieść na inny framework ??
22.
Riddle napisał(a):
14 lipca 2007, 16:48:56
Patrz na moje usta: JA ssałem w jQuery.
Dodaj komentarz: