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 (první)

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ý.

Parsovaní / kompilace (opakovaná)

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.

Test zpracování desetinných čísel 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é. 

factorial  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.

Přečtení hodnoty ze skriptu

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.

Nastavení hodnoty do skriptu

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.

instance

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ů) :)

Zveřejněno 07 October 09 08:45 by topas
Vedeno pod: ,

Upozornění na nové komentáře

Pokud chčeš dostávat upozornění emailem na změny u toho příspěvku,tak se zaregistruj zde.zde

Odebírat komentáře k tomuto příspěvku pomocí RSS

Komentář

# Jony said on October 7, 2009 12:14 PM:

;)  v casti DotScript (C# a VB) vypliva -> vyplyva

# stej said on October 7, 2009 12:17 PM:

Můžu se zeptat, jaká verze PowerShellu to byla? A jestli by bylo možné i mezi sebou tyto verze porovnat.

# topas said on October 7, 2009 1:25 PM:

Jony: Fuj, díky moc. Opraveno a stydím se. :)

stej: V počítači mám PowerShell 2.0 CTP. Nevím, jestli by oproti verzi 1 mohl být nějaký rozdíl.

# Borek said on October 8, 2009 8:47 PM:

Výborná série, díky za ni!

# stej said on October 8, 2009 9:55 PM:

Jojo, připojuju se, pěknej souhrn.

# topas said on October 13, 2009 3:13 PM:

Diky, jsem rad, ze se libi. :)

Vytvoření nového komentáře

(povinný) 
(nepovinný)
(povinný) 
Opiš čísla, která vidíš na obrázku: