Technologie vývoje webových aplikací
JavaScript benchmark – řetězce, regulární výrazy a asociativní pole Matěj Outlý & Jaroslav Mlejnek Abstrakt Použití skriptovacího jazyka JavaScript na internetových stránkách je dnes už skoro samozřejmostí. Tvůrcům webů dává možnost přiblížit internetové prezentace klasické desktopové aplikaci a nezřídka kdy je JavaScriptový kód i více jak tísíci řádkový. Tento referát podává přehled o rychlosti vykonávání JavaScriptových příkazů v jednotlivých dostupných internetových prohlížečích. Konkrétně je pak zaměřen na práci s řetězci, regulárními výrazy a asociativním polem. Prezentovány jsou nejen výsledky měření, ale i popis jednotlivých testů a framework, který vypočtená data spravuje.
1
Úvod
V referátu se budeme zabývat testováním implementace řetězců, regulárních výrazů a asociativních polí včetně jejich nejpoužívanějších funkcí (metod) v interpretovaném skriptovacím jazyce JavaScript v běžných internetových prohlížečích. Jsou jimi: Mozilla Firefox, Opera, Microsoft Internet Explorer, Apple Safari a Konqueror. Tomuto testování (a nejen tomuto testování) se říká benchmarking. Obecně za benchmark je považováno vykonání (proces) nějakého programu nebo sady programů za účelem zjištění výkonu testovaného subjektu. Testovaným subjektem může být např. CPU (z oblasti hardware) nebo kompilátor (z oblasti software). Za benchmark je považován také onen samotný program, pomocí nějž testujeme. Definici benchmarku můžeme ještě více zobecnit a říci, že benchmark je metoda k porovnávání výkonu různých testovaných subjektů běžících v různých prostředích. V našem případě – metoda znamená porovnávání časové délky vykonávání generátorem vygenerovaného JavaScriptového kódu, 1
– testovaným subjektem je implementace JavaScriptu v internetovém prohlížeči a – prostředími jsou běžně dostupné internetové prohlížeče. Smyslem uskutečnění tohoto měření je zjistit, jak si prohlížeče poradí s objemnějším JavaScriptovým kódem (30 MB zdrojového kódu a více) a jak zvládají práci s extrémními daty. Naše testy se nesnaží o vystižení reálných úloh.
2
Testy
Každý test je vygenerován zvláštním parametrizovatelným generátorem naprogramovaným v C++. Sestavený JavaScriptový kód se sestává z jediné funkce run(), viz zdrojový kód 1. // my_test.js // function run() { // kód testu ... return true; } Zdroj. kód 1: kostra testu.
Všechny generátory mají společnou kostru – viz zdrojový kód 2. Nejprve jsou deklarovány proměnné, které budou dále v JavaScriptovém kódu použity. Poté následují dva do sebe vnořené cykly, které budeme dále označovat vnějším a vnitřním cyklem. Generátor zpravidla funguje tak, že na začátku každého vnějšího cyklu vygeneruje náhodná data, která jsou následně dokola zpracovávána vnitřním cyklem. Část zdrojového kódu uvnitř vnitřího cyklu označená „opakované provádění kroků testu“ generuje výkonné příkazy testující danou oblast (třídění asociativních polí, vyhledávání v řetězcích atp.). Samotné výkonné příkazy jsou zpravidla ve skupinách po šesti a snaží se použít všechny funkce a JavaScriptové operátory týkající se dané oblasti. Konstanta PATTERN_LENGTH udává počet opakování výkonných příkazů testujících danou oblast resp. podoblast. Konstanta ITERATION_NUM nastavuje počet opakování celého testu. Zadefinováním či nedefinováním USING_FOR_LOOP zůstává stejná funkčnost testu, rozliší se pouze způsob rozšíření JavaScriptového kódu. V prvním případě, definováním USING_FOR_LOOP, bude test zopakován pomocí JavaScriptové smyčky 2
for, kód bude mít velikost jednoho testu + režie (viz 2). Nevýhodou je však, že do každého vnějšího cyklu vstupují stále stejná data (pouze jednou vygenerovaná generátorem), což má za následek větší pravděpodobnost zanesení statistické chyby do testu. Nedefinováním USING_FOR_LOOP bude výsledný kód obsahovat USING_FOR_LOOP× test zřetězený za sebou + režii. Vznikne tedy test s lepšími daty, avšak mnohonásobně větší soubor, který prohlížeče musí umět správně načíst. Všechny použité testy jsou vygenerovány generátorem s definovaným USING_ FOR_LOOP kvůli prohlížeči Opera, který v základním nastavení není schopen několik desítek MB velký JavaScript načíst. Rozmezí velikostí použitých testů je od 34kB do 2,5MB. V dalším textu budeme pojmem test myslet jedno zavolání funkce run(). // Deklarace použitých JavaScriptových proměnných. o << "var ac1;" << endl; o << "var ac2;" << endl; o << "var ac3;" << endl; ... #ifdef USING_FOR_LOOP o << "for (var i = 0; i < " << ITERATION_NUM << "; ++i) {" << endl; #else for (int i = 0; i < ITERATION_NUM; ++i) { #endif // Inicializace JavaScriptových proměnných // pro jednu vnější iteraci. ... for (int i = 0; i < PATTERN_LENGTH; ++i) { // Opakované provádění kroků testu o << "ac3 = ac1.concat(ac2);" << endl; o << "ac3 = ac2.concat(ac1);" << endl; ... } #ifdef USING_FOR_LOOP o << "}" << endl; #else } #endif Zdroj. kód 2: kostra generátoru jednoho testu.
3
2.1
Spojování dlouhých řetězců
První test má za úkol otestovat rychlost implementace spojování textových řetězců. Délka řetezce se pohybuje řádově ve stovkách znaků a testován je zejména operátor + na objektu String, tedy operátor zřetězení a dále jeho metoda concat. Obě varianty pouze spojí dva řetězce za sebe.
2.2
Podřetězce řetězců
Tento test vybírá podřetězce náhodné délky pomocí metod substring, substr a slice objektu String. Tyto metody pracují v zásadě stejně, liší se pouze parametry. Vstupní řetezec má opět délku řádově ve stovkách znaků, délka podřetezce se postupně zvětšuje.
2.3
Hledání v řetězci
V tomto testu se jedná o jednoduché vyhledávání podřetězce v textu. Jsou použity metody indexOf, lastIndexOf a match objektu String. Je asi zřejmé, že metoda indexOf vrací index prvního výskytu hledaného podřetězce, metoda lastIndexOf naopak poslední a metoda match se chová stejně jako indexOf, pokud je jí jako parametr předán obyčejný řetezec (tedy ne reguární výraz), proto je do tohoto testu také zařazena. Krátké hledané podřetězce jsou generovány náhodně, dále je pro vyhledávání použit jeden nikoli náhodný, ale o hodně delší podřetězec. Vstupní řetězec má stejnou délku jako v předchozím testu.
2.4
Validace řetězce pomocí regulárních výrazů
Otestování pouhé validace podle regulárního výrazu (tedy test na shodu) je realizováno pomocí metody test objektu RegExp. Pro otestování je použito celkem 6 různých regulárních výrazů s postupně rostoucí složitostí. Generovány jsou po-stupným ’nabalováním složitosti’ s ohledem na řetězec, na kterém se bude testovat.
2.5
Nahrazení v řetězci pomocí regulární výrazů
Stejně jako předchozí test používá šesti různých regulárních výrazů k otestování metody replace na objektu RegExp.
4
Tato metoda má za úkol nahradit ta místa, kde vstupní text matchuje s regulárním výrazem, nějakým, v našem případě náhodně vygenerovaným, řetězcem. Použité regulární výrazy jsou generovány obdobným způsobem jako v předchozím testu.
2.6
Rozdělení řetězce na podřetězce pomocí regulárních výrazů
Poslední test používající regulární výrazy je zaměřen na rozdělení vstupního textu do pole podle daného regulárního výrazu. To odpovídá metodě split, opět na objektu RegExp. Regulární výrazy jsou stejné (stejně generované) jako v předchozích testech.
2.7
Hledání v poli
Další skupina testů začíná pouhým otestováním vybírání prvků z asociativního pole. Jediné úskalí testu spočívá v tom, že pole obsahuje řádově tisíce prvků (dlouhých řetězců) indexované řetězcovými klíči o délce ve stovkách znaků. Testován je tedy operátor [] objektu Array.
2.8
Třídění pole
Tento test je zaměřený na třídění dlouhých asociativních polí s řetězcovými klíči o délce opět ve stovkách znaků. Test se snaží po každém třídění pole opětovně rozházet např. změnou nějakého prvku za nový náhodně vygenerovaný. Testuje se tedy zejména metoda sort na objektu Array.
2.9
Konkatenace polí
Konečně poslední test má za úkol pouhé spojování dlouhých asociativních polí (opět řádově v tisícovkách prvků). Testujeme tedy metodu concat objektu Array.
3
Framework
Pro snadnější správu testů byl vytvořen framework zajišťující výběr testu, spuštění testu, uložení výsledků a vytvoření skriptu pro statistický software R. Framework je naprogramován ve skriptovacím jazyce PHP, v našem případě běží na webovém serveru Apache a data ukládá do databáze MySQL. Adresářová struktura: 5
– tests/ – adresář obsahující jednotlivé testy, array_concat.js – test spojování velkých asoc. polí, array_find.js – test vyhledávání podle klíče v asoc. poli, array_sort.js – test třídění velkých asoc. polí, regexp_test.js – test na shodu s regulárním výrazem, regexp_split.js – test na rozdělení podle reg. výrazu, regexp_replace.js – test na nahrazení podle reg. výrazu, string_concat.js – test spojování dlouhých řetězců, string_substring.js – test na podřetězce a string_search.js – test vyhledávání v řetězcích. – index.php – Výchozí stránka s nastavením parametrů testu, – R.php – generátor R skriptů, – run.php – průběh výpočtu, – save.php – uložení vypočtených výsledků do databáze a – stat.php – zobrazení vypočtených dat.
3.1
Parametry testu – index.php
V internetovém prohlížeči je možno zvolit tyto parametry testu: – typ testu – automaticky generovaný seznam dostupných testů umístěných v podadresáři tests/, – internetový prohlížeč – framework automaticky vybere správný prohlížeč, – počítač – manuální výběr stroje, na kterém test probíhá, – počet iterací – počet opakování vybraného testu a – iterovat pomocí JavaScriptového for cyklu – způsob opakování vybraného testu, a to buď spuštění funkce run() v rámci vygenerovaného for cyklu a nebo několikanásobným vložením JavaScriptového skriptu volajícího funkci run() do kódu za sebe. Kliknutím na tlačítko „run the test“ jsou parametry předány stránce run.php.
6
3.2
Spuštění testu (výpočet) – run.php
PHP skript run.php na základě získaných parametrů sestaví webovou stránku obsahující elementy <script> s odkazem na soubor s JavaScriptovým testem a voláním procedury run(), která test spouští. Navíc před samotným spuštěním každého testu funkcí run() zaznamená aktuální čas a po skončení běhu testu vypočítá z nového aktuálního času a zaznamenaného času dobu průběhu v milisekundách. Výsledky průběžně ukládá do pole. <script type="text/javascript" src="tests/my_test.js"> ... <script type="text/javascript"> start = new Date(); if (!run()) alert("Error."); end = new Date(); results[i] = end - start; ... <script type="text/javascript"> window.location = "save.php?results=" + results.join(";"); Zdroj. kód 3: testovací stránka.
Po zavolání poslední iterace testu sestaví GET požadavek s výsledky měření a proběhne automatické přesměrování na skript save.php.
3.3
Uložení výsledků měření – save.php
Jakmile skončí všechna měření, jejich výsledky jsou předány skriptu save.php, který je pouze uloží do databáze MySQL.
3.4
Generování skriptu pro R – R.php
K analýze naměřených dat je použit statistický software R. Aby skripty pro tento software nemusely být psány ručně, byl naprogramován jejich parametrizovatelný generátor. 7
V první fázi výpočtu jsou ze všech získaných dat vypočteny aritmetické průměry, v ostatních fázích se počítá pouze s nimi. Podporované výstupy jsou – celkový přehled měření všech testů na všech prohlížečích po testech, – celkový přehled měření všech testů na všech prohlížečích po prohlížečích, – sečtená doba průměrů běhu všech testů po prohlížečích, – sečtená doba průměrů běhu testů v jednotlivých kategoriích, – přehled všech provedených testů na vybraném prohlížeči a – přehled všech prohlížečů, na kterých byl vybraný test spuštěn.
4
Závěrečná statistika
Bylo provedeno celkem 9 testů, každý po alespoň 10 opakováních. Testovanými prohlížeči byly – Microsoft Internet Explorer 6.0, 7.0 a testovací verze 8.0, – Mozilla Firefox 1.0, 1.5, 2.0 a testovací verze 3.0, – Opera 7.5, 8.0, 9.2 a testovací verze 9.5, – Apple Safari 3.1, – Konqueror 3.5 a 4.0. Časy uváděné v grafech jsou doby běhu funkce run() v milisekundách (ms). Tato doba ale de-facto nemá nějakou vypovídající hodnotu, nemůžeme např. říci, že spojení dvou řetězců „stojí“ 4µs. Berme proto dobu běhu funkce run() pouze jako poměrové měřítko. Benchmark proběhl na dvou strojích, každý s jinou hardwarovou výbavou a operačním systémem. Většina testů proběhla na stroji s procesorem Mobile AMD Sempron 3000+, frekvencí 1, 8GHz a operačním systémem Microsoft Windows XP. Benchmark majoritních linuxových prohlížečů proběhl na stroji s procesorem Intel Core 2 Duo 7500, frekvencí jádra 2,2GHz a s operačním systémem GNU/Linux distribuce Gentoo.
8
4.1
Celková statistika – stroj s MS Windows
Graf 4 ukazuje přehled všech prohlížečů jak dopadly v jednotlivých testech. Summary for jbook_xp
Safari 3.1 Opera 9.5 Opera 9.2 Opera 8.0 Opera 7.5 Konqueror 4.0 IE 8.0 IE 7.0 IE 6.0 Firefox 3.0 Firefox 2.0 Firefox 1.5 Firefox 1.0
string_substring.js string_search.js string_concat.js regexp_test.js regexp_split.js regexp_replace.js array_sort.js array_find.js array_concat.js
0
500000
1000000
1500000
Duration in ms
Graf 4: Celková statistika windowsového stroje.
Z grafu je patrné, že prohlížeče Opera mají s JavaScriptovými regulárními výrazy vcelku problémy, zvláště pak test nahrazení podřetězce podle regulárního výrazu. Vzhledem k tomu, že v tomto testu neuspěly všechny verze tohoto internetového prohlížeče, lze vyloučit náhodnou chybu vyskytující se ve zdrojovém kódu JavaScriptového interpreteru. Na grafu je také vidět, že tvůrci Opery na regulárních výrazech stále pracují a (nepočítáme-li testovací verzi) časy běhu skriptů zkracují. Nejlépe nedopadl ani test na třídění polí u prohlížečů Konqueror, který oproti ostatním prohlížečům mnohonásobně zaostává. Protože algoritmus třídění (resp. reverze, který je také použit v tomto testu) patří mezi triviální algoritmy, usuzujeme, že zde se o chybu v interpreteru už jedná. K tomuto závěru nás také vede společné jádro WebKit prohlížeče Konqueror a Apple Safari, který v testech naopak suveréně vyhrává.
4.2
Statistika dle kategorií testů
Graf 5 ukazuje součet průměrných dob přes všechny testy v daných kategoriích (řetězce, regulární výrazy a asociativní pole) a udává celkovou výkonost jednotlivých prohlížečů v těchto kategoriích.
9
Total summary for jbook_xp
Safari 3.1 Opera 9.5 Opera 9.2 Opera 8.0 Opera 7.5 Konqueror 4.0 IE 8.0 IE 7.0 IE 6.0 Firefox 3.0 Firefox 2.0 Firefox 1.5 Firefox 1.0
Strings
RegExps
Arrays
0
500000
1000000
1500000
2000000
Duration in ms
Graf 5: Výkon prohlížečů v testovaných kategoriích.
Jak již bylo zmíněno výše v popisu předchozí statistiky, internetový prohlížeč Opera zaostává v regulárních výrazech, Apple Safari má oproti všem prohlížečům nezanedbatelný náskok a překvapivě dobře dopadl i internetový prohlížeč Microsoft Internet Explorer.
10
4.3
Celkový výkon prohlížečů
Data na obrázku 6 jsou získaná stejným způsobem, jako v předchozí statistice, tedy sečtěním průměrných hodnot výsledků jednotlivých testů. Tentokrát je však statistika celková, nekategorizovaná. Total summary on jbook_xp
Safari 3.1 Opera 9.5 Opera 9.2 Opera 8.0 Opera 7.5 Konqueror 4.0 IE 8.0 IE 7.0 IE 6.0 Firefox 3.0 Firefox 2.0 Firefox 1.5 Firefox 1.0
0
500000
1000000
1500000
2000000
Duration in ms
Graf 6: Celkový výkon jednotlivých prohlížečů.
Nyní můžeme stanovit jakési „pořadí“ rychlosti prohlížečů dle výkonosti: 1. Apple Safari 2. Microsoft Internet Explorer 3. Mozilla Firefox 4. Opera 5. Konqueror Konqueror by svými výkony měl zaujímat příčku těsně za prohlížečem Mozilla Firefox, avšak výsledek testu třídění polí ho bohužel dostal na poslední místo.
4.4
Celková statistika přes prohlížeče
Graf 7 nabízí ještě jeden alternativní pohled na celkovou statistiku, tentokrát setříděnou dle internetových prohlížečů.
11
Summary for jbook_xp
string_substring.js string_search.js string_concat.js regexp_test.js regexp_split.js regexp_replace.js array_sort.js array_find.js array_concat.js
Safari 3.1 Opera 9.5 Opera 9.2 Opera 8.0 Opera 7.5 Konqueror 4.0 IE 8.0 IE 7.0 IE 6.0 Firefox 3.0 Firefox 2.0 Firefox 1.5 Firefox 1.0
0
500000
1000000
1500000
Duration in ms
Graf 7: Celkový přehled výkonů prohlížečů v jednotlivých testech.
4.5
Výsledky testů po prohlížečích
Zde jsou k dispozici jednotlivé výsledky testů setříděné po prohlížečích, které ukazují, v jakých testech si jaký prohlížeč stojí. Grafy jsou bez komentáře. 4.5.1
Mozilla Firefox Firefox 1.0 on jbook_xp
string_substring.js string_search.js string_concat.js regexp_test.js regexp_split.js regexp_replace.js array_sort.js array_find.js array_concat.js
0
20000
40000
60000
Duration in ms
Graf 8: Prohlížeč Firefox 1.0.
12
80000
Firefox 1.5 on jbook_xp
string_substring.js string_search.js string_concat.js regexp_test.js regexp_split.js regexp_replace.js array_sort.js array_find.js array_concat.js
0
20000
40000
60000
Duration in ms
Graf 9: Prohlížeč Firefox 1.5.
Firefox 2.0 on jbook_xp
string_substring.js string_search.js string_concat.js regexp_test.js regexp_split.js regexp_replace.js array_sort.js array_find.js array_concat.js
0
20000
40000
60000
80000
Duration in ms
Graf 10: Prohlížeč Firefox 2.0.
13
80000
Firefox 3.0 on jbook_xp
string_substring.js string_search.js string_concat.js regexp_test.js regexp_split.js regexp_replace.js array_sort.js array_find.js array_concat.js
0
5000
10000
15000
20000
25000
Duration in ms
Graf 11: Prohlížeč Firefox 3.0, testovací verze.
4.5.2
Opera Opera 7.5 on jbook_xp
string_substring.js string_search.js string_concat.js regexp_test.js regexp_split.js regexp_replace.js array_sort.js array_find.js array_concat.js
0
500000
1000000
1500000
Duration in ms
Graf 12: Prohlížeč Opera 7.5.
14
Opera 8.0 on jbook_xp
string_substring.js string_search.js string_concat.js regexp_test.js regexp_split.js regexp_replace.js array_sort.js array_find.js array_concat.js
0e+00
1e+05
2e+05
3e+05
4e+05
5e+05
Duration in ms
Graf 13: Prohlížeč Opera 8.0.
Opera 9.2 on jbook_xp
string_substring.js string_search.js string_concat.js regexp_test.js regexp_split.js regexp_replace.js array_sort.js array_find.js array_concat.js
0e+00
1e+05
2e+05
3e+05
4e+05
Duration in ms
Graf 14: Prohlížeč Opera 9.2.
15
6e+05
Opera 9.5 on jbook_xp
string_substring.js string_search.js string_concat.js regexp_test.js regexp_split.js regexp_replace.js array_sort.js array_find.js array_concat.js
0e+00
1e+05
2e+05
3e+05
4e+05
5e+05
6e+05
Duration in ms
Graf 15: Prohlížeč Opera 9.5, testovací verze.
4.5.3
Microsoft Internet Explorer IE 6.0 on jbook_xp
string_substring.js string_search.js string_concat.js regexp_test.js regexp_split.js regexp_replace.js array_sort.js array_find.js array_concat.js
0
2000
4000
6000
8000
10000
12000
14000
Duration in ms
Graf 16: Prohlížeč Microsoft Internet Explorer 6.0.
16
IE 7.0 on jbook_xp
string_substring.js string_search.js string_concat.js regexp_test.js regexp_split.js regexp_replace.js array_sort.js array_find.js array_concat.js
0
5000
10000
15000
Duration in ms
Graf 17: Prohlížeč Microsoft Internet Explorer 7.0.
IE 8.0 on jbook_xp
string_substring.js string_search.js string_concat.js regexp_test.js regexp_split.js regexp_replace.js array_sort.js array_find.js array_concat.js
0
2000
4000
6000
8000
10000
Duration in ms
Graf 18: Prohlížeč Microsoft Internet Explorer 8.0, testovací verze.
17
4.5.4
Apple Safari Safari 3.1 on jbook_xp
string_substring.js string_search.js string_concat.js regexp_test.js regexp_split.js regexp_replace.js array_sort.js array_find.js array_concat.js
0
1000
2000
3000
4000
5000
6000
7000
Duration in ms
Graf 19: Prohlížeč Apple Safari 3.1.
4.5.5
Konqueror Konqueror 4.0 on jbook_xp
string_substring.js string_search.js string_concat.js regexp_test.js regexp_split.js regexp_replace.js array_sort.js array_find.js array_concat.js
0
500000
1000000
1500000
Duration in ms
Graf 20: Prohlížeč Konqueror 4.0.
18
Konqueror 4.0 on jbook_xp
string_substring.js
string_search.js
string_concat.js
regexp_test.js
regexp_split.js
regexp_replace.js
array_find.js
array_concat.js
0
5000
10000
15000
Duration in ms
Graf 21: Prohlížeč Konqueror 4.0 bez testu array_sort.
4.6
Výsledky testů po testech
V každém testu je velmi zřetelně vidět rychlost prohlížeče Apple Safari. Grafy jsou bez komentáře. 4.6.1
Spojování asociativních polí array_concat.js on jbook_xp
Safari 3.1 Opera 9.5 Opera 9.2 Opera 8.0 Opera 7.5 Konqueror 4.0 IE 8.0 IE 7.0 IE 6.0 Firefox 3.0 Firefox 2.0 Firefox 1.5 Firefox 1.0
0
5000
10000
15000
20000
25000
30000
Duration in ms
Graf 22: Test array_concat.
19
35000
4.6.2
Vyhledávání podle klíče v asoc. poli array_find.js on jbook_xp
Safari 3.1 Opera 9.5 Opera 9.2 Opera 8.0 Opera 7.5 Konqueror 4.0 IE 8.0 IE 7.0 IE 6.0 Firefox 3.0 Firefox 2.0 Firefox 1.5 Firefox 1.0
0
5000
10000
15000
20000
Duration in ms
Graf 23: Test array_find.
4.6.3
Třídění velkých asociativních polí array_sort.js on jbook_xp
Safari 3.1 Opera 9.5 Opera 9.2 Opera 8.0 Opera 7.5 Konqueror 4.0 IE 8.0 IE 7.0 IE 6.0 Firefox 3.0 Firefox 2.0 Firefox 1.5 Firefox 1.0
0
500000
1000000 Duration in ms
Graf 24: Test array_sort.
20
1500000
4.6.4
Nahrazení podle regulárního výrazu regexp_replace.js on jbook_xp
Safari 3.1 Opera 9.5 Opera 9.2 Opera 8.0 Opera 7.5 Konqueror 4.0 IE 8.0 IE 7.0 IE 6.0 Firefox 3.0 Firefox 2.0 Firefox 1.5 Firefox 1.0
0
500000
1000000
1500000
Duration in ms
Graf 25: Test regexp_replace.
4.6.5
Rozdělení podle regulárního výrazu regexp_split.js on jbook_xp
Safari 3.1 Opera 9.5 Opera 9.2 Opera 8.0 Opera 7.5 Konqueror 4.0 IE 8.0 IE 7.0 IE 6.0 Firefox 3.0 Firefox 2.0 Firefox 1.5 Firefox 1.0
0
50000
100000
150000
200000
Duration in ms
Graf 26: Test regexp_split.
21
250000
4.6.6
Testovaní na shodu regexp_test.js on jbook_xp
Safari 3.1 Opera 9.5 Opera 9.2 Opera 8.0 Opera 7.5 Konqueror 4.0 IE 8.0 IE 7.0 IE 6.0 Firefox 3.0 Firefox 2.0 Firefox 1.5 Firefox 1.0
0
2000
4000
6000
8000
10000
12000
Duration in ms
Graf 27: Test regexp_test.
4.6.7
Spojování dlouhých řetězců string_concat.js on jbook_xp
Safari 3.1 Opera 9.5 Opera 9.2 Opera 8.0 Opera 7.5 Konqueror 4.0 IE 8.0 IE 7.0 IE 6.0 Firefox 3.0 Firefox 2.0 Firefox 1.5 Firefox 1.0
0
20000
40000
60000
80000
100000
Duration in ms
Graf 28: Test string_concat.
22
120000
4.6.8
Podřetězce string_substring.js on jbook_xp
Safari 3.1 Opera 9.5 Opera 9.2 Opera 8.0 Opera 7.5 Konqueror 4.0 IE 8.0 IE 7.0 IE 6.0 Firefox 3.0 Firefox 2.0 Firefox 1.5 Firefox 1.0
0
5000
10000
15000
Duration in ms
Graf 29: Test string_substring.
4.6.9
Vyhledávání v řetězcích string_search.js on jbook_xp
Safari 3.1 Opera 9.5 Opera 9.2 Opera 8.0 Opera 7.5 Konqueror 4.0 IE 8.0 IE 7.0 IE 6.0 Firefox 3.0 Firefox 2.0 Firefox 1.5 Firefox 1.0
0
10000
20000
30000
40000
50000
Duration in ms
Graf 30: Test string_search.
4.7
Celková statistika – stroj s Gentoo Linux
Jak již bylo zmíněno, měření proběhlo také na počítači s instalovaným operačním systémem Gentoo Linux. Testovány byly tři majoritní prohlížeče: Mozilla Firefox 2.0, Opera 9.2 a Konqueror 3.5. Výsledky testů na tomto stroji jsou totožné s výsledky testů na stroji s Microsoft Windows (myšleno poměrově stejné, nikoliv absolutně). Dokonce prohlížeč 23
Summary for notemat_gentoo
Opera 9.2 Konqueror 3.5 Firefox 2.0
string_substring.js
string_search.js
string_concat.js
regexp_test.js
regexp_split.js
regexp_replace.js
array_sort.js
array_find.js
array_concat.js
0e+00
2e+05
4e+05
6e+05
8e+05
Duration in ms
Graf 31: Celková statistika linuxového stroje.
Konqueror ve verzi 3.5 má stejné problémy s testem na třídění velkých asociativních polí jako jeho nástupce 4.0 – lze tedy vyloučit chybu implementace JavaScriptového interpreteru způsobenou portem primárně linuxového internetového prohlížeče na operační systém Microsoft Windows.
4.8
Statistika dle kategorií testů
Oproti statistice 5 najdeme v grafu 32 rozdíl v rychlosti zpracování řetězců. Prohlížeč Opera je na linuxovém stroji výkonově srovnatelný s ostatními prohlížeči. Připomeňme, že prohlížeč Opera byl přibližně 2× pomalejší než Firefox a Konqueror.
24
Total summary for notemat_gentoo
Opera 9.2 Konqueror 3.5 Firefox 2.0
Strings
RegExps
Arrays
0e+00
2e+05
4e+05
6e+05
8e+05
Duration in ms
Graf 32: Výkon prohlížečů v testovaných kategoriích.
4.9
Celkový výkon prohlížečů
I přesto, že Opera dosáhla lepších výsledků v testech na řetězce, výsledné pořadí se u těchto prohlížečů nezměnilo. Total summary on notemat_gentoo
Opera 9.2
Konqueror 3.5
Firefox 2.0
0e+00
2e+05
4e+05
6e+05
8e+05
Duration in ms
Graf 33: Celkový výkon jednotlivých prohlížečů.
Na operačním systému Linux je pořadí prohlížečů nezměněné: 1. Mozilla Firefox 2. Opera 3. Konqueror 25
4.10
Celková statistika přes prohlížeče
Poslední přehled provedených testů na prohlížečích: Summary for notemat_gentoo
string_substring.js string_search.js string_concat.js regexp_test.js regexp_split.js regexp_replace.js array_sort.js array_find.js array_concat.js
Opera 9.2
Konqueror 3.5
Firefox 2.0
0e+00
2e+05
4e+05
6e+05
8e+05
Duration in ms
Graf 34: Celkový přehled výkonů prohlížečů v jednotlivých testech.
4.11
Výsledky testů po prohlížečích
Zde jsou k dispozici jednotlivé výsledky testů setříděné po prohlížečích, které ukazují, v jakých testech si jaký prohlížeč stojí. Grafy jsou bez komentáře. 4.11.1
Mozilla Firefox Firefox 2.0 on notemat_gentoo
string_substring.js string_search.js string_concat.js regexp_test.js regexp_split.js regexp_replace.js array_sort.js array_find.js array_concat.js
0
5000
10000
15000
20000
25000
30000
Duration in ms
Graf 35: Prohlížeč Firefox 2.0.
26
35000
4.11.2
Opera Opera 9.2 on notemat_gentoo
string_substring.js string_search.js string_concat.js regexp_test.js regexp_split.js regexp_replace.js array_sort.js array_find.js array_concat.js
0
50000
100000
150000
200000
Duration in ms
Graf 36: Prohlížeč Opera 9.2.
4.11.3
Konqueror Konqueror 3.5 on notemat_gentoo
string_substring.js string_search.js string_concat.js regexp_test.js regexp_split.js regexp_replace.js array_sort.js array_find.js array_concat.js
0e+00
2e+05
4e+05
6e+05
Duration in ms
Graf 37: Prohlížeč Konqueror 3.5.
4.12
Výsledky testů po testech
Grafy jsou bez komentáře.
27
8e+05
4.12.1
Spojování asociativních polí array_concat.js on notemat_gentoo
Opera 9.2
Konqueror 3.5
Firefox 2.0
0
5000
10000
15000
20000
25000
30000
Duration in ms
Graf 38: Test array_concat.
4.12.2
Vyhledávání podle klíče v asoc. poli array_find.js on notemat_gentoo
Opera 9.2
Konqueror 3.5
Firefox 2.0
0
2000
4000
6000
8000
Duration in ms
Graf 39: Test array_find.
28
10000
4.12.3
Třídění velkých asociativních polí array_sort.js on notemat_gentoo
Opera 9.2
Konqueror 3.5
Firefox 2.0
0e+00
2e+05
4e+05
6e+05
8e+05
Duration in ms
Graf 40: Test array_sort.
4.12.4
Nahrazení podle regulárního výrazu regexp_replace.js on notemat_gentoo
Opera 9.2
Konqueror 3.5
Firefox 2.0
0
50000
100000
150000
Duration in ms
Graf 41: Test regexp_replace.
29
200000
4.12.5
Rozdělení podle regulárního výrazu regexp_split.js on notemat_gentoo
Opera 9.2
Konqueror 3.5
Firefox 2.0
0
20000
40000
60000
80000
Duration in ms
Graf 42: Test regexp_split.
4.12.6
Testovaní na shodu regexp_test.js on notemat_gentoo
Opera 9.2
Konqueror 3.5
Firefox 2.0
0
500
1000
1500
2000
2500
Duration in ms
Graf 43: Test regexp_test.
30
3000
4.12.7
Spojování dlouhých řetězců string_concat.js on notemat_gentoo
Opera 9.2
Konqueror 3.5
Firefox 2.0
0
500
1000
1500
2000
Duration in ms
Graf 44: Test string_concat.
4.12.8
Podřetězce string_substring.js on notemat_gentoo
Opera 9.2
Konqueror 3.5
Firefox 2.0
0
500
1000
1500
Duration in ms
Graf 45: Test string_substring.
31
2000
4.12.9
Vyhledávání v řetězcích string_search.js on notemat_gentoo
Opera 9.2
Konqueror 3.5
Firefox 2.0
0
500
1000
1500
2000
2500
3000
Duration in ms
Graf 46: Test string_search.
5
Dnes používané benchmarky
5.1
SunSpider a Dromaeo
SunSpider JavaScript Benchmark, který lze nalézt na internetové adrese http://webkit.org/perf/sunspider-0.9/sunspider.html, je představitelem opačného způsobu testování, než byl náš benchmark. Zatímco naše testy vyžadovaly od prohlížečů maximální výkon a testovaly jejich chování v extrémních situacích, SunSpider Benchmark se snaží co nejvěrněji vystihnout realitu (reálné úlohy). Dalším rozdílem oproti našim testům je, že SunSpider Benchmark netestuje pouze vybrané oblasti JavaScriptu, ale je komplexní – toto mj. vyplývá i z jeho snahy být co nejblíže realitě. Tento benchmark testuje jazyk JavaScript jako takový, nikoliv DOM. Ze SunSpider benchmarku vychází Mozillou vytvořený benchmark Dromaeo, který obsahuje podmnožinu SunSpider testů. Nalezneme ho na internetové adrese http://dromaeo.com/.
32
5.2
DHTML Benchmark & Drawing Perfomance Test
Tyto benchmarky – http://people.opera.com/ pettern/performance-1.html a http://people.opera.com/ pettern/performance-2.html – jsou zaměřeny na DOM. „Rychlost“ (výkon prohlížeče) je zde udávána jako počet snímků za sekundu vzhledem k počtu objektů.
33
Reference [1] Mozilla: Dromaeo. http://dromaeo.com/ [2] Jak psát web. http://www.jakpsatweb.cz/ [3] Měřím já, měříš ty: za JavaScript rychlejší.. http://met.blog.root.cz/2008/04/11/merim-ja-meristy-za-javascript-rychlejsi/ [4] Microsoft support: How to set time-out period for script. http://support.microsoft.com/kb/175500 [5] Opera: dhtml benchmark. http://people.opera.com/ pettern/performance-1.html [6] Opera: Drawing Perfomance Test. http://people.opera.com/ pettern/performance-2.html [7] SunSpider JavaScript Benchmark. http://webkit.org/perf/sunspider-0.9/sunspider.html [8] W3Schools: JavaScript Reference. http://www.w3schools.com/jsref/default.asp
34