Jestli se za poslední roky něco v prohlížečích zlepšilo nade všechna očekávání, tak je to rychlost JavaScriptu. A tím myslím ve všech prohlížečích. I když ačkoliv se jak Opera tak Internet Explorer (ve svém osmičkové verzi) rovněž dost snaží, k největšímu souboji dochází zdá se mezi WebKitem (Safari) a Geckem (Firefoxem). Na jaře jsem se ptal, jak dlouho tenhle trend prohlížečů vydrží.
Vydržel. Ačkoliv trojková verze Firefoxu i trojjedničková verze Safari přinesla zrychlení, boj neskončil.
Vývojáři Webkitu začátkem léta zabodovali, když oznámili svůj nový JavaScriptový interpret SquirrelFish, který díky řadě optimalizací procházení syntaktického stromu (lépe a přesněji vysvětlují vývojáři) dosáhnul dalšího zrychlení (v průměru 1,6× viz graf).
Počet proběhlých testů SunSpider za minutu (vyšší číslo = lepší)
Během léta bylo zdánlivě ticho po pěšině. Ovšem tento týden zabodoval pro změnu druhý tým. Do vývojových verzí Firefoxu 3.1 byl zahrnut projekt TraceMonkey. Ten do JavaScriptového enginu SpiderMonkey přidává JIT (just-in-time) code compilation (lepší vysvětlení a ještě lepší vysvětlení), se kterou je JavaScript v Gecku oproti předchozím verzím 1.8× až 22× rychlejší (podle druhu testu) a daří se mu předehnat i SquirellFish. Projekt není dosud dokončen, ve výsledku bude zrychlení ještě větší.
John Resig dokonce srovnává rychlost JavaScriptu s céčkem: „With this improvement it's leap-frogged any sort of traditional and has gone head-to-head with computationally-powerful languages like C.“ To je skutečně odvážné tvrzení (zdá se, že porovnávali s neoptimalizovaným výstupem gcc), počkám si zvědavě na dokončení projektu, zda bude výsledek opravdu srovnatelný.
V práci na Tracemonkey pomohl i kód od Adobe a výsledek se zpětně nejspíš dostane i do dalších verzí Flashe (takže i jeho ActionScript bude rychlejší). Práce na Tracemonkey začala před asi 60 dny (tj. pár týdnů po té, co WebKit oznámil SquirellFish), nicméně JIT bylo avizováno již asi před dvěma lety jako součást Mozilla 2.
Zajímalo by mne, zda už teď pro změnu vývojáři WebKitu přemýšlí, zda a jak tenhle náskok vyrovnají. Nic bych na to nedal, když by nám ještě před koncem roku připravili nějaké další překvapení. Držím jim palce. Zrychlení JavaScriptu v prohlížečích umožní, aby některé dnes pomalé hříčky byly časem vhodné i do produkčního prostředí. A také idea Mozilla 2, ve které mnohem větší část kódu prohlížeče bude napsána přímo v JavaScriptu, se stává reálnější.
A já se opět ptám. Kde se to zastaví, kde se to zastaví?
Nejlepší na tom všem je, že všechny tyhle optimalizace JavaScriptu v prohlížečích posouvají state-of-art v interpretaci dynamických skriptovacích jazyků obecně. Například tacing trees, použité ve Firefoxu, jsou (pokd vím) úplně nová technika, kterou půjde použít i pro další jazyky jako Python nebo Ruby. Zdá se, že teprve prohlížeče a složité webové aplikace byly dostatečnou motivací pro další výzkum v téhle oblasti.
Hezké na tom je taky to, že to celé vzniká ve spolupráci s univerzitou - ukázkový příklad spolupráce kooperace komerční a akademické sféry.
"Kde se to zastaví, kde se to zastaví?" - no přece až bude JS rychlý jako céčko :-)
Hmm, skoda jen, ze ackoliv je spidermonkey vicevlaknovej interpret JS, tak je do mozilly naroubovan jak single-threaded. Tzn. jedno vlakno s jednou frontou javascriptovych volani, ktere je treba obslouzit. Krome security kontextu se nikde nerozlisuje, jestli je vykonavany JS kod soucasti XULu, nebo jestli jde o kod z nejake HTML stranky. A tak se klidne muze stat, ze se cela mozilla zastavi(zasekne), protoze jedna zalozka obsahuje JS kod, ktery sam o sobe neni optimalni. Podle me mozilla ani nerozlisuje ktery JS kod smi naalokovat kolik pameti.
To je dobrá zpráva a to i pro ostatní dynamické jazyky, jak poznamenává David Majda. Bohužel ale s nástupem vícejádrových procesorů začne být čím dál důležitější podpora konkurenčního zpracování. Problém Firefoxu popsal Ivan, já bych chtěl dodat, že například pro CPython (a u standardní implementace Ruby je to, myslím podobné) začíná být velmi omezující tzv. global interpreter lock, který omezuje škálovatelnost výpočtu ve více vláknech. A to se týká i jiných jazyků s garbage collectorem, jako je například OCaml. Doufejme, že i tohle časem vývojáři vyřeší.
Inkvizitor: I těm více jádrům u JavaScriptu trochu svítá, jakmile se začne používat http://html456.blogspot.com/2008/08/na-web-prijde-javascript-s-vice-vlakny.html
inkvizitor: garbage collector, kdyz ma podporu pro paralelni prostredi, coz dneska uz neni zadna veda, je v tomto ohledu naprosto podruzna vec. vetsi tezkosti delaji operace se side-effecty (konkurencni pristup k pameti, I/O) a s tema se vyporadat to uz neni takova sranda...
Martin Hassman ex-biochemik, umělecký programátor a publicista. Spoluzakladatel CZilly, zakladatel Zdrojáku, správce HTML5.cz, organizátor hackathonů, čekovacích muzejních nocí aj. akcí.
Přečteno 24 844×
Přečteno 24 381×
Přečteno 21 017×
Přečteno 20 054×
Přečteno 19 962×