Skriptování v .NETu 8 (Závěrečné porovnání)
Dost bylo jednotlivých skriptovacích jazyků. Myslím, že jsem vybral zástupce nejčastějších a nejzajímavějších jazyků, které by se pro .NETové prostředí daly použít. Pojďme je nyní porovnat a shrnout jejich klady a zápory.
Pro úplnost uvádím seznam skriptovacích jazyků s odkazy na jednotlivé díly seriálu, které jsme zatím prozkoumali:
- DotScript (jazyky C# a VB)
- IronPython
- IronRuby
- Lua
- Boo
- JScript .NET
- PowerShell
Tyto jazyky by se daly rozdělit do třech skupin. Skupina jazyků, které jsou implementovány nad Dynamic Language Runtime – IronPython, IronRuby.
Skupina jazyků, které jsou pomocí CodeDomProvideru nebo jinak překládány přímo do CLI, a dále se reflexí pracuje s vytvořenými třídami a voláním funkcí nebo metod. – DotScript, Boo, JScript .NET.
Poslední zbývající jazyky jsou: Lua (používá plně managed knihovnu LuaInterface) a PowerShell, který není třeba představovat.
Vyhodnocení
Skriptovací jazyky jsem porovnával v sedmi kategoriích, které si popíšeme. Základem vyhodnocení je následující tabulka, ve které jsou zaznamenané časy jednotlivých měření (v milisekundách). Každý test se opakoval milionkrát. U některých měření jsem musel změnšít počet opakování z důvodu velké časové náročnosti (výsledný čas jsem samozřejmě vynásobil, aby bylo měření poměrově v pořádku).
| | DotScript | IronPython | IronRuby | Lua | Boo | JScript .NET | PowerShell |
| Parsování / kompilace (první) | 160 | 1600 | 1450 | 300 | 750 | 125 | 1300 |
| Parsování / kompilace (opakovaná) | 160 | 50 | 50 | 20 | 100 | 80 | 130 |
| Float test | 1753 | 18451 | 2045800 | 60884 | 2070 | 2310 | 3714700 |
| Faktoriál test | 2260 | 21981 | 2096220 | 18815 | 2534 | 4669 | 19126400 |
| Zápis do skriptu | 1860 | 4086 | 502 | 2059 | 598 | 641 | 1200 |
| Čtení ze skriptu | 1835 | 4092 | 443 | 1767 | 524 | 554 | 1100 |
| Vytvoření instance | 7644 | 14353 | 2928030 | 5267 | 3448 | 3075 | 4626000 |
Nyní si rozeberme jednotlivé kategorie a ke slovu přijdou slibované grafy. :)
Parsování / kompilace (první)
V tomto čase se hodně projevuje režie, která je z větší části dána načítáním potřebných assembly.
Zde trvá nejdéle inicializace skriptovacích jazyků založených na Dynamic Language Runtime.
Parsování / kompilace (opakovaná)
Při opakované inicializaci skriptovacího engine jsou už všechny assembly nahrané, a tak čas vypovídá o zpracování zdrojových kódů.
V tomto testu zvítězil jazyk Lua, který je v tomto směru rychle zpracovatelný.
Float test
Tento test měl změřit, jak rychle si skript dokáže poradit s výpočtem rovnice
sin2(30)+cos2(30), a výsledek (metody/funkce) vrátit hlavnímu programu. Čas udává milion opakování testu.
V tomto testu jsou nejlepší jazyky, které jsou přímo překládány do CIL.
Osa Y je v logaritmickém měřítku.
Faktoriál test
Test spočíval ve výpočtu faktoriálu čísla 12 (tedy 12!) rekurzivním voláním funkce a vrácení výsledku (z metody/funkce) hlavnímu programu. Čas udává milion opakování testu.
V tomto testu byl o hodně horší PowerShell, ve kterém bylo opakované rekurzivní volání velmi pomalé.
Osa Y je v logaritmickém měřítku.
Čtení hodnoty proměnné ze skriptu
Čtení hodnoty ze skriptu se používá tam, kde je třeba přečíst výsledek, který skript počítal. Jedná se o volání metody, která proměnnou z kontextu skriptovacího jazyka přečte a hodnotu vrátí do hlavního programu. Čas udává milion opakování testu.
Větší čas u jazyka IronPython je dán tím, že se četla členská proměnná testovací třídy namísto globální proměnné u jazyka IronPython.
Zápis hodnoty proměnné do skriptu
Zápis proměnné z hlavního programu se používá zpravidla na začátku před samotným výpočtem. Většinou se jedná pouze o volání metody, která proměnnou v kontextu skriptovacího jazyka nastaví. Čas udává milion opakování testu.
Větší čas u jazyka IronPython je dán tím, že se zapisovala členská proměnná testovací třídy namísto globální proměnné u jazyka IronPython.
Vytvoření instance třídy ve skriptu
Úkolem tohoto testu bylo vrátit instanci třídy ze skriptu tak, aby se mohla v hlavním programu použít. Malou výjimkou zde byl jazyk Lua, který místo objektů používá systém tabulek, ve kterých jsou jak záznamy pro data (členské proměnné), tak pro funkce.
Závěrečné hodnocení
Nyní si u jednotlivých jazyků shrneme klady a zápory podle výsledků a subjektivního názoru na syntaxi. Podrobnější informace k jednotlivým jazykům se můžete dočíst v předcházejících dílech seriálu.
Pokud bychom výpočty ze skriptovacího jazyka potřebovali volat opakovaně (např. při výpočtu animace, apod.), a hodně záleželo na rychlosti, doporučuji využít skriptovací jazyky, které svůj kód před použitím zkompilují do CLI tedy: DotScript, Boo nebo JScript.NET.
DotScript (C# a VB)
Knihovna DotScript je zaobalení CodeDomProvideru a umožňuje zpracovat jazyky C# a VB. Pokud skriptuje programátor, je velká výhoda právě použití těchto jazyků – programátor se nemusí učit nic nového. Z vyhodnocení testů vyplývá, že toto řešení je velmi rychlé. Avšak z testu čtení a zápisu proměnných vyplívá, že DotScript má okolo těchto operací větší režii.
IronPython, IronRuby
IronPython je jazyk, který vyniká svou přehledností i u velkých projektů. IronRuby je zase snadno naučitelný. Oba tyto jazyky jsou implementovány nad Dynamic Language Runtime, což je “podhoubí” pro libovolné skriptovací jazyky. V testech dopadl poměrně dobře IronPython – jeho rychlost by ve většině případů neměla ovlivnit aplikaci. U IronRuby se to říci nedá. Bohužel testy ukázaly pomalost např. při výpočtu faktoriálu.
Lua
Tento jednoduchý jazyk byl nejrychlejší ve zpracování zdrojového kódu skriptu. Ve vyhodnocování byl průměrný. Ovšem ve výsledku se jedná o velmi dobré řešení, které v mnoha úlohách splní svůj účel.
Boo
Tento jazyk byl pro mne milým překvapením, protože jsem ho do té doby neznal. Je stejně přehledný jako Python (byl jím inspirován) a má velkou rychlost z důvodu kompilace do CLI před použitím. Ze subjektivního poměru rychlost/syntaxe ho považuji za vítěze testů.
JScript .NET
Tento jazyk představuje etalon v rychlosti skriptování. V článku o JScript .NET jsem ukázal použití CodeDomProvideru, což je asi nejoptimálnější způsob, jak v .NETu skriptovat, pokud můžeme použít reflexi k operacím mezi skriptem a hlavním programem. Syntaxe JScript .NET je také výhodná, pokud by měl psát skripty někdo se znalostmi JavaScriptu – např. webový vývojář.
PowerShell
Tento jazyk jsem zařadil z čisté zvědavosti, protože mě zajímala jeho integrace do .NETových programů. Bohužel mě trochu zklamala pomalost, ale ta může být za určitých podmínek vykoupena známostí PowerShellu a dostupnou dokumentací.
Závěr
Doufám, že vám tato moje malá exkurze do světa skriptovacích jazyků trochu pomohla s určením toho, který z nich je pro vás v daném případě nejvhodnější.
Pro úplný závěr seriálu chybí ještě jeden test – nějaký z praxe, na kterém by se ukázaly naplno klady a zápory daného jazyka. Proto poslední článek tohoto seriálu bude o praktickém použití. Přiložím také zdrojové kódy, ve kterých bude vidět integrace jednotlivých skriptovacích jazyků.
PS: Můžete se těšit na želvičku! (Vykreslování L-System fraktálů) :)