Mitkä ohjelmointikielet käyttävät vähiten sähköä?

huhti 9, 2021
admin

Kertovatko energiankäyttötiedot mitään ohjelmointikieliemme laadusta?

Viime vuonna kuuden portugalilaisen tutkijan ryhmä kolmesta eri yliopistosta päätti tutkia tätä kysymystä, ja lopulta he julkaisivat artikkelin ”Energy Efficiency Across Programming Languages”. He ajoivat 10 ohjelmointiongelman ratkaisuja, jotka oli kirjoitettu 27:llä eri kielellä, ja seurasivat samalla huolellisesti, kuinka paljon sähköä kukin kieli käytti – sekä nopeutta ja muistin käyttöä.

tulokset - Energian, ajan ja muistin käyttö (kuvakaappaus tutkimuspaperista)

Kohtaisesti he käyttivät 10:tä ongelmaa, jotka olivat peräisin Tietokoneen kielten esikuva-analyysipelistä (Computer Language Benchmarks Game). Kyseessä on suorituskyvyn vertailevaan vertailuun tähtäävä ilmainen ohjelmistoprojekti, joka sisältää vakiomuotoisen joukon yksinkertaisia algoritmiongelmia sekä kehyksen testien suorittamista varten. (Se tunnettiin aiemmin nimellä ”The Great Computer Language Shootout.”) ”Näin saimme vertailukelpoisen, edustavan ja laajan joukon ohjelmia… sekä kääntämis-/suorittamisvaihtoehdot ja kääntäjäversiot.”

Olikin tärkeää ajaa erilaisia vertailuarvotestejä, koska loppujen lopuksi niiden tulokset vaihtelivat sen mukaan, mitä testiä suoritettiin. Esimerkiksi C-kieli osoittautui kaiken kaikkiaan nopeimmaksi ja myös energiatehokkaimmaksi. Mutta vertailutestissä, jossa skannattiin DNA-tietokannasta tiettyä geneettistä sekvenssiä, Rust oli energiatehokkain – kun taas C-kieli sijoittui kolmanneksi.

Jopa tuon saman testin sisällä ”paras” kieli riippuu siitä, mikä on kriteerisi. Tässä testissä C osoittautui myös vasta toiseksi nopeimmaksi kieleksi (jälleen Rustin jälkeen). Mutta Rust putosi yhdeksän sijaa, jos tulokset lajiteltiin muistin käytön mukaan. Ja vaikka Fortran oli tässä testissä toiseksi energiatehokkain kieli, se putosi kuusi sijaa, kun tulokset lajiteltiin suoritusajan mukaan.

Nopeampi kieli ei aina ole energiatehokkain.

Tutkijat huomauttavat, että he ”noudattivat tiukasti” CLBG-projektin ohjeita kääntäjäversioista ja parhaista optimointilipuista. Virrankulutus mitattiin Intelin työkalulla – Running Average Power Limit -työkalulla – ja jokaista ohjelmaa ei suoritettu vain kerran vaan 10 kertaa, ”jotta kylmäkäynnistysten ja välimuistivaikutusten vaikutusta voitiin vähentää ja jotta voitiin analysoida mittausten johdonmukaisuutta ja välttää poikkeamat.” (Tästä syystä he raportoivat, että ”mitatut tulokset ovat varsin johdonmukaisia”.) Johdonmukaisuuden lisäämiseksi kaikki testit tehtiin työpöydällä, jossa oli Linux Ubuntu Server 16.10 (ytimen versio 4.8.0-22-generic), 16 Gt RAM-muistia ja 3,20 GHz:n Haswell Intel Core i5-4460 -suoritin.

Paperissaan tutkijat nostavat esiin joitakin mielenkiintoisia tuloksia.

”Lisp kuluttaa keskimäärin 2.27x enemmän energiaa (131,34J) kuin C, samalla kun sen suorittamiseen kuluu 2,44x enemmän aikaa (4926,99ms) ja se tarvitsee 1,92x enemmän muistia (126,64Mb) verrattuna Pascaliin.”

He vertasivat myös tuloksia käännetyistä kielistä verrattuna tulkattuihin kieliin (jossa on erillinen luokka virtuaalikoneissa toimiville kielille). Paperi sisältää myös erillisen vertailun eri ohjelmointiparadigmojen välillä – mukaan lukien sekä funktionaalinen että imperatiivinen ohjelmointi sekä oliopohjainen ohjelmointi ja skriptiohjelmointi.

Onko nopeampi vihreämpi?

Paperissa tarkasteltiin ankarasti yleistä olettamusta, jonka mukaan nopeampi ohjelma kuluttaa aina vähemmän energiaa, ja huomautettiin, että se ei ole niin yksinkertaista kuin fysiikan laki, joka sanoo, että E(nergi(a) = T(ime) x P(ower). Tämä johtuu osittain siitä, että energiaa ei kuluteta tasaisesti, tutkijat toteavat ja viittaavat siihen, että tämä saattaa vaikuttaa muiden tutkijoiden työhön, jossa tutkitaan, vaikuttaako ohjelman suoritusaika sen energiankulutukseen. (”Johtopäätökset tästä asiasta poikkeavat joskus toisistaan…”) Eräässä heidän vertailutestissään Chapel-ohjelman suorittaminen kesti 55 prosenttia vähemmän aikaa kuin vastaavan Pascal-kielellä kirjoitetun ohjelman – ja silti Pascal-ohjelma käytti 10 prosenttia vähemmän energiaa.

Vaikka siis edelleen vallitsee yleinen uskomus, että energiankulutus laskee, kun ohjelmat suoritetaan nopeammin, tutkijat toteavat yksiselitteisesti, että ”nopeampi kieli ei aina ole energiatehokkain.”

Kysymykseen voi olla vaikea vastata, sillä virrankulutukseen vaikuttavat monet tekijät (kuten kääntäjän laatu ja se, mitä kirjastoja käytetään). Mutta lopulta tutkijat pystyivät jopa erittelemään energiankulutuksen sen mukaan, kuluttaako sitä CPU vai DRAM – ja päätyivät siihen tulokseen, että suurimman osan energiasta (noin 88 prosenttia) kulutti keskimäärin CPU riippumatta siitä, oliko vertailuohjelma käännetty, tulkattu vai ajettu virtuaalikoneessa.

Interventoivaa on, että tulkattujen kielten kohdalla vaihtelu oli hiukan suurempaa, sillä CPU kulutti joskus jopa 92 prosenttia.90 prosenttia tehosta tai niinkin vähän kuin 81,57 prosenttia.

Tutkittuaan tuloksiaan tutkijat päättelivät myös, että DRAM-muistin huippukäytön ja energiankulutuksen välinen suhde ”on lähes olematon.”

Tutkimus tarjoaa lisää näkemyksiä ikuiseen kysymykseen: onko nopeampi vihreämpi? Kyllä, on totta, että ”viisi energiatehokkainta kieltä säilyttävät sijansa, kun ne lajitellaan suoritusajan mukaan ja hyvin pienillä eroilla sekä energia- että aika-arvoissa.”

Itse asiassa yhdeksässä kymmenestä vertailuongelmasta huippupisteet (sekä nopeuden että energiatehokkuuden osalta) tulivat joltakin kolmesta ylipäätään nopeimmasta ja energiatehokkaimmasta kielestä – mikä ei yllättänyt tutkijoita. ”On yleisesti tiedossa, että nämä kolme parasta kieltä (C, C++ ja Rust) ovat tunnetusti voimakkaasti optimoituja ja tehokkaita suoritussuorituskyvyn kannalta, kuten myös aineistomme osoittaa.”

Mutta kun muut 24 kieltä asetetaan paremmuusjärjestykseen niiden suoritusajan perusteella, järjestys ei ole sama kuin energiatehokkuuden perusteella. ”Vain neljä kieltä säilyttää saman energia- ja ajoaikaluokituksen (OCaml, Haskel, Racket ja Python), kun taas loput ovat täysin sekaisin.”

Ja jopa yksittäisissä vertailuarvotesteissä on tapauksia, joissa nopeat kielet eivät ole energiatehokkaimpia.”

Käännettyjen kielten hyvät puolet

Tuli myös muita mielenkiintoisia tuloksia. Käännetyt kielet ”pyrkivät olemaan” energiatehokkaimpia ja nopeimmin toimivia – ja heidän paperinsa osaa jopa kvantifioida tämän eron numerolla. ”Keskimäärin käännetyt kielet kuluttivat ratkaisujen suorittamiseen 120J, kun taas virtuaalikoneen ja tulkattujen kielten kohdalla tämä arvo oli 576J ja 2365J.”

Tutkijat sovelsivat samaa tarkkuutta myös vertaillessaan suoritusaikoja ja päättelivät, että keskimäärin ”käännetyillä kielillä kesti 5103ms, virtuaalikoneella toimivilla kielillä kesti 20623ms ja tulkatuilla kielillä kesti 87614ms.”

Viidestä parhaana olleesta kielestä molemmissa kategorioihin kuuluvista kielten sarjoissa, neljä oli käännettyjä. (Poikkeuksena Java.)

Energiankulutus Käy-time
C 57J 2019 ms
Rust 59J 2103 ms
C++ 77J 3155 ms
Ada 98J 3740 ms
Java 114J 3821 ms

Viisi hitainta kieltä olivat kaikki tulkattuja: Lua, Python, Perl, Ruby ja Typescript. Myös viisi eniten energiaa kuluttavaa kieltä olivat tulkattuja: Perl, Python, Ruby, JRuby ja Lua.

Mutta samaan aikaan, kun merkkijonoja käsiteltiin säännöllisillä lausekkeilla, kolme viidestä energiatehokkaimmasta kielestä osoittautui tulkatuiksi kieliksi (TypeScript, JavaScript ja PHP), ”vaikka ne eivät yleensä olekaan kovin energiatehokkaita muissa skenaarioissa.”

Kompiloidut kielet veivät myös viisi ensimmäistä sijaa vähiten käytetyn muistitilan osalta.

Kieli Tarvittu muistitila
Pascal 66Mb
Go 69Mb
C 77Mb
Fortran 82Mb
C++ 88Mb

”Keskimäärin, käännetyt kielet tarvitsivat keskimäärin 125 Mt, virtuaalikonekielet 285 Mt ja tulkatut kielet 426 Mt”, tutkijat raportoivat. Samaan aikaan tulkatut kielet veivät neljä viidestä alimmasta sijasta, eli ne kuluttivat eniten muistitilaa: JRuby, Dart, Lua ja Perl. (Vaikka Erlang ei ole tulkattu kieli, se olisi myös viiden viimeisen joukossa, Dartin ja Luan välissä).

”Jos lajitellaan ohjelmointiparadigman mukaan, imperatiiviset kielet tarvitsivat 116Mb, oliosuuntautuneet 249Mb, funktionaaliset 251Mb ja lopuksi skriptiohjelmointi tarvitsi 421Mb.”

Vertailtaessa eri paradigmoja imperatiivinen ohjelmointi nousi itse asiassa usein voitolle. Sen vertailuohjelmat käyttivät myös keskimäärin paljon vähemmän energiaa – ja sujuivat paljon nopeammin – kuin oliosuuntautuneen, funktionaalisen ja skriptiparadigman vertailuohjelmat.

Kulutettu energia Ajoaika
Imperatiivinen 125J 5585ms
Object-Oriented 879J 32965ms
Functional 1367J 42740ms
Scripting 2320J 88322 ms

Mutta on paljon tekijöitä otettava huomioon. ”On selvää, että eri ohjelmointiparadigmoilla ja jopa saman paradigman sisällä olevilla kielillä on täysin erilainen vaikutus energiankulutukseen, aikaan ja muistiin”, tutkijat kirjoittavat. Se, mikä näistä on tärkeintä, riippuu kuitenkin skenaariostasi. (Esimerkiksi taustatehtävät eivät aina tarvitse nopeinta suoritusaikaa..)

Ja joissakin sovelluksissa on otettava huomioon kaksi tekijää – esimerkiksi energiankulutus ja suoritusaika. Siinä tapauksessa ”C on paras ratkaisu, koska se on hallitseva molemmissa yksittäisissä tavoitteissa”, tutkijat kirjoittavat. Jos yrität säästää aikaa ja käyttää samalla vähemmän muistia, C, Pascal ja Go ”vastaavat toisiaan” – ja sama pätee, jos tarkkailet kaikkia kolmea muuttujaa (aikaa, energiankulutusta ja muistin käyttöä). Mutta jos yrität vain säästää energiaa ja käyttää samalla vähemmän muistia, parhaat vaihtoehdot ovat C tai Pascal.

Parhaat kielet tiettyihin skenaarioihin (kuvakaappaus tutkimuspaperista)
Tutkimuspaperin lopussa tutkijat lisäävät, että jatkotutkimusta varten he haluaisivat tutkia, korreloiko muistin kokonaiskäyttö ajan mittaan paremmin kulutetun energian kanssa.

He jakavat tietonsa verkossa ja ehdottavat, että se helpottaa tulevien tutkijoiden mahdollisuuksia vertailla esimerkiksi .NET-kieliä tai JVM-kieliä. Kehittäjille, jotka työskentelevät mobiilisovellusten, Internet-of-Things-järjestelmien tai muiden rajallisista virtalähteistä ammentavien sovellusten parissa, virrankulutus on suuri huolenaihe.

Mutta lopulta tutkimus saattaa jättää ohjelmoijille myös sen, mitä he vihaavat eniten: epäselvyyden. Tutkijat raportoivat, että jos etsit yhtä ainoaa parasta ohjelmointikieltä, ”tähän kysymykseen ei ole konkreettista ja lopullista vastausta.”

”Vaikka energiatehokkain kieli kussakin vertailussa on lähes aina myös nopein, tosiasia on, että ei ole mitään kieltä, joka olisi johdonmukaisesti muita parempi”, tutkijat päättelevät. ”Tilanne, jossa kieltä aiotaan käyttää, on keskeinen näkökohta määritettäessä, onko kyseinen kieli energiatehokkain vaihtoehto.”

Vastaa

Sähköpostiosoitettasi ei julkaista.