Které programovací jazyky spotřebují nejméně elektřiny?
Mohou nám údaje o spotřebě energie něco říci o kvalitě našich programovacích jazyků?
V loňském roce se tým šesti portugalských výzkumníků ze tří různých univerzit rozhodl tuto otázku prozkoumat a nakonec vydal článek s názvem „Energetická účinnost napříč programovacími jazyky“. Spustili řešení 10 programovacích problémů napsaných ve 27 různých jazycích, přičemž pečlivě sledovali, kolik elektřiny který z nich spotřebuje – a také jeho rychlost a využití paměti.
Konkrétně použili 10 problémů z Computer Language Benchmarks Game, což je volně dostupný softwarový projekt pro porovnávání výkonu, který obsahuje standardní sadu jednoduchých algoritmických problémů a také rámec pro spouštění testů. (Dříve byl znám jako „The Great Computer Language Shootout.“) „To nám umožnilo získat srovnatelnou, reprezentativní a rozsáhlou sadu programů… spolu s možnostmi kompilace/vykonávání a verzemi kompilátorů.“
Bylo důležité provádět různé srovnávací testy, protože jejich výsledky se nakonec lišily podle toho, který test byl prováděn. Například celkově se ukázalo, že jazyk C je nejrychlejší a také energeticky nejúspornější. Ale ve srovnávacím testu, který spočíval ve vyhledávání určité genetické sekvence v databázi DNA, byl energeticky nejúspornější jazyk Rust – zatímco jazyk C se umístil na třetím místě.
I v rámci téhož testu však „nejlepší“ jazyk závisí na tom, jaké je vaše kritérium. I v tomto testu se jazyk C ukázal být pouze druhým nejrychlejším jazykem (opět se umístil za jazykem Rust). Rust však klesl o celých devět pozic, pokud byly výsledky seřazeny podle využití paměti. A zatímco Fortran byl v tomto testu druhým energeticky nejefektivnějším jazykem, klesl také o plných šest pozic, pokud byly výsledky místo toho seřazeny podle doby provádění.
Rychlejší jazyk není vždy energeticky nejefektivnější.
Výzkumníci poznamenávají, že „přísně dodržovali“ pokyny projektu CLBG týkající se verzí kompilátorů a nejlepších optimalizačních příznaků. Spotřeba energie byla měřena pomocí nástroje od společnosti Intel – nástroje Running Average Power Limit – přičemž každý program nebyl spuštěn pouze jednou, ale desetkrát, „aby se snížil vliv studených startů a vlivu cache a aby bylo možné analyzovat konzistenci měření a vyhnout se odlehlým hodnotám“. (Z tohoto důvodu uvádějí, že „naměřené výsledky jsou poměrně konzistentní.“) Pro větší konzistenci byly všechny testy prováděny na stolním počítači s operačním systémem Linux Ubuntu Server 16.10 (jádro verze 4.8.0-22-generic), 16 GB paměti RAM a 3,20GHz procesorem Haswell Intel Core i5-4460.
Vědci ve svém článku upozorňují na některé zajímavé výsledky.
„Lisp v průměru spotřebuje 2,5 GB paměti.27x více energie (131,34 J) než jazyk C, přičemž jeho provedení trvá 2,44x déle (4926,99 ms) a ve srovnání s jazykem Pascal je potřeba 1,92x více paměti (126,64 MB).“
Srovnávali také výsledky kompilovaných jazyků oproti interpretovaným jazykům (se samostatnou kategorií pro jazyky, které běží na virtuálních strojích). A článek obsahuje také samostatné srovnání různých programovacích paradigmat – včetně funkcionálního i imperativního programování, plus objektově orientovaného programování a skriptování.
Je rychlejší ekologičtější?“
Příspěvek se podrobně zabýval běžným předpokladem, že rychlejší program vždy spotřebuje méně energie, a poukázal na to, že to není tak jednoduché jako fyzikální zákon, který říká E(nergy) = T(ime) x P(ower). Výzkumníci poznamenávají, že je tomu tak částečně proto, že energie není vynakládána konzistentní rychlostí, což může mít vliv na práci dalších výzkumníků, kteří zkoumají, zda doba běhu programu ovlivňuje jeho spotřebu energie. („Závěry týkající se této otázky se někdy rozcházejí…“) V jednom z jejich srovnávacích testů trvalo provedení programu v jazyce Chapel o 55 % kratší dobu než provedení ekvivalentního programu napsaného v Pascalu – a přesto tento program v Pascalu spotřeboval o 10 % méně energie.
Ačkoli tedy stále panuje obecné přesvědčení, že spotřeba energie klesá, když programy běží rychleji, výzkumníci jednoznačně konstatují, že „rychlejší jazyk není vždy energeticky nejúčinnější.“
Na tuto otázku lze těžko odpovědět, protože spotřebu energie ovlivňuje mnoho faktorů (včetně kvality překladače a toho, jaké knihovny se používají). Nakonec však výzkumníci dokázali dokonce rozdělit spotřebu energie podle toho, zda ji spotřebovává procesor nebo paměť DRAM – dospěli k závěru, že většinu energie (přibližně 88 %) spotřebovává v průměru procesor, ať už je srovnávací program kompilovaný, interpretovaný nebo spuštěný na virtuálním stroji.
Zajímavé je, že interpretované jazyky vykazovaly o něco větší odchylky, přičemž procesor někdy spotřebovával až 92 % energie.90 procent energie nebo jen 81,57 procenta.
Po prostudování svých výsledků došli vědci také k závěru, že vztah mezi špičkovým využitím paměti DRAM a spotřebou energie „téměř neexistuje.“
Výzkum poskytuje další poznatky k věčné otázce: Je rychlejší ekologičtější? Ano, je pravda, že „prvních pět energeticky nejúspornějších jazyků si zachovává své pořadí, pokud jsou seřazeny podle doby provádění a s velmi malými rozdíly v hodnotách energie i času.“
Ve skutečnosti u devíti z deseti srovnávacích problémů dosáhl nejlepšího výsledku (z hlediska rychlosti i energetické účinnosti) jeden ze tří celkově nejrychlejších a energeticky nejúspornějších jazyků – což výzkumníky nepřekvapilo. „Je všeobecně známo, že tyto tři nejlepší jazyky (C, C++ a Rust) jsou známé tím, že jsou silně optimalizované a efektivní z hlediska výkonu provádění, jak ukazují i naše data.“
Při hodnocení ostatních 24 jazyků podle doby provádění však nevidíte stejné pořadí jako při hodnocení podle energetické efektivity. „Pouze čtyři jazyky si udržují stejné pořadí podle energie a času (OCaml, Haskel, Racket a Python), zatímco ostatní jsou zcela promíchány.“
A dokonce i v jednotlivých srovnávacích testech se objevují případy, kdy rychle výkonné jazyky nejsou energeticky nejúčinnější.
Přednosti kompilovaných jazyků
Zjistili jsme i další zajímavé výsledky. Zkompilované jazyky „mají tendenci“ být energeticky nejúspornější a nejrychleji pracující – a jejich článek dokonce dokáže tento rozdíl vyčíslit číslem. „V průměru spotřebovaly kompilované jazyky na provedení řešení 120J, zatímco u virtuálního stroje a interpretovaných jazyků byla tato hodnota 576J, resp. 2365J.“
Stejnou přesnost výzkumníci použili i při porovnávání doby provádění a došli k závěru, že v průměru „kompilované jazyky potřebovaly 5103ms, jazyky virtuálního stroje 20623ms a interpretované jazyky 87614ms.“
Z pěti nejlepších jazyků v obou kategoriích byly čtyři z nich kompilované. (Výjimka? Java.)
Spotřebovaná energie | Proběh-čas | |
C | 57J | 2019 ms |
Rust | 59J | 2103 ms |
C++ | 77J | 3155 ms |
Ada | 98J | 3740 ms |
Java | 114J | 3821 ms |
Všech pět nejpomalejších jazyků bylo interpretovaných: Lua, Python, Perl, Ruby a Typescript. A pět jazyků, které spotřebovaly nejvíce energie, bylo rovněž interpretovaných: Perl, Python, Ruby, JRuby a Lua.
Při manipulaci s řetězci pomocí regulárních výrazů se však zároveň ukázalo, že tři z pěti energeticky nejúspornějších jazyků jsou interpretované jazyky (TypeScript, JavaScript a PHP), „ačkoli v jiných scénářích nebývají příliš energeticky úsporné.“
Kompilované jazyky také obsadily prvních pět míst v žebříčku nejmenšího množství spotřebovaného paměťového prostoru.
Jazyk | Potřeba paměťového prostoru |
Pascal | 66Mb |
Go | 69Mb |
C | 77Mb |
Fortran | 82Mb |
C++ | 88Mb |
„V průměru, kompilované jazyky potřebovaly 125Mb, jazyky virtuálního stroje 285Mb a interpretované 426Mb,“ uvádějí výzkumníci. Přitom interpretované jazyky si nárokovaly čtyři z pěti posledních míst, což znamená, že spotřebovaly nejvíce paměťového prostoru: JRuby, Dart, Lua a Perl. (Erlang sice není interpretovaný jazyk, ale také by se objevil v dolní pětce, mezi Dartem a Lua).
„Pokud bychom je seřadili podle jejich programovacího paradigmatu, potřebovaly imperativní jazyky 116Mb, objektové 249Mb, funkcionální 251Mb a konečně skriptovací 421Mb.“
Ve skutečnosti se při porovnávání různých paradigmat imperativní programování často dostalo na vrchol. Jeho srovnávací programy také spotřebovaly v průměru mnohem méně energie – a běžely mnohem rychleji – než srovnávací programy pro objektové, funkcionální a skriptovací paradigma.
Spotřebovaná energie | Čas běhu | |
Imperativní | 125J | 5585ms |
Objektově orientovaný program.Oriented | 879J | 32965ms |
Functional | 1367J | 42740ms |
Funkční | 2320J | 88322 ms |
Je však třeba zvážit mnoho faktorů. „Je zřejmé, že různá programovací paradigmata a dokonce i jazyky v rámci jednoho paradigmatu mají zcela odlišný dopad na spotřebu energie, času a paměti,“ píší výzkumníci. Přesto bude záležet na scénáři, který z nich je nejdůležitější. (Například úlohy na pozadí nepotřebují vždy nejrychlejší běh..)
A některé aplikace vyžadují zohlednění dvou faktorů – například spotřeby energie a doby provádění. V takovém případě je „C nejlepším řešením, protože je dominantní v obou jednotlivých cílech,“ píší výzkumníci. Pokud se snažíte ušetřit čas a zároveň spotřebovat méně paměti, C, Pascal a Go „jsou rovnocenné“ – a totéž platí, pokud sledujete všechny tři proměnné (čas, spotřebu energie a využití paměti). Pokud se však snažíte pouze ušetřit energii a zároveň použít méně paměti, jsou nejlepší volbou jazyky C nebo Pascal.
V závěru práce vědci dodávají, že pro další studii by rádi prozkoumali, zda celkové využití paměti v čase lépe koreluje se spotřebovanou energií.
Svá data sdílejí online a naznačují, že to budoucím výzkumníkům usnadní porovnávání například jazyků .NET nebo JVM. Pro vývojáře, kteří pracují s mobilními aplikacemi, systémy internetu věcí nebo jinými aplikacemi čerpajícími energii z omezených zdrojů, je spotřeba energie velkým problémem.
Nakonec však studie může programátorům zanechat i to, co nesnášejí nejvíce: nejednoznačnost. Výzkumníci uvádějí, že pokud hledáte jediný nejlepší programovací jazyk, „tato otázka nemá konkrétní a konečnou odpověď.“
„Přestože energeticky nejúspornější jazyk v každém benchmarku je téměř vždy ten nejrychlejší, faktem je, že neexistuje jazyk, který by byl trvale lepší než ostatní,“ uzavírají výzkumníci. „Situace, na které bude jazyk použit, je klíčovým aspektem pro určení, zda je tento jazyk energeticky nejúčinnější variantou.“