Which Programming Languages Use the Least Electricity?

kw. 9, 2021
admin

Czy dane dotyczące zużycia energii mogą nam coś powiedzieć o jakości naszych języków programowania?

W zeszłym roku zespół sześciu naukowców z Portugalii z trzech różnych uniwersytetów postanowił zbadać to pytanie, ostatecznie wydając pracę zatytułowaną „Energy Efficiency Across Programming Languages”. Uruchomili oni rozwiązania 10 problemów programistycznych napisanych w 27 różnych językach, jednocześnie uważnie monitorując, ile energii elektrycznej zużył każdy z nich – jak również jego prędkość i wykorzystanie pamięci.

wyniki - Energia, czas i wykorzystanie pamięci (zrzut ekranu z pracy badawczej)

Specyficznie, użyli oni 10 problemów z Computer Language Benchmarks Game, projektu wolnego oprogramowania do porównywania wydajności, który zawiera standardowy zestaw prostych problemów algorytmicznych, jak również ramy do przeprowadzania testów. (Wcześniej był on znany jako „The Great Computer Language Shootout.”) „To pozwoliło nam uzyskać porównywalny, reprezentatywny i obszerny zestaw programów… wraz z opcjami kompilacji/wykonania oraz wersjami kompilatorów.”

Ważne było przeprowadzenie różnych testów porównawczych, ponieważ ostatecznie ich wyniki różniły się w zależności od tego, który test był wykonywany. Na przykład, ogólnie rzecz biorąc, język C okazał się najszybszy, a także najbardziej energooszczędny. Ale w teście porównawczym, który polegał na skanowaniu bazy danych DNA w poszukiwaniu konkretnej sekwencji genetycznej, Rust był najbardziej energooszczędny – podczas gdy C zajął trzecie miejsce.

Ale nawet w tym samym teście, „najlepszy” język zależy od tego, jakie jest twoje kryterium. W tym teście C również okazał się być tylko drugim najszybszym językiem (ponownie plasując się za Rustem). Ale Rust spadł o całe dziewięć pozycji, jeśli wyniki zostały posortowane według wykorzystania pamięci. I chociaż Fortran był drugim najbardziej energooszczędnym językiem dla tego testu, również spadł o całe sześć pozycji, gdy wyniki były sortowane według czasu wykonania.

Szybszy język nie zawsze jest najbardziej energooszczędny.

Badacze zauważają, że „ściśle przestrzegali” wytycznych projektu CLBG dotyczących wersji kompilatorów i najlepszych flag optymalizacyjnych. Zużycie energii było mierzone przy użyciu narzędzia firmy Intel – Running Average Power Limit tool – przy czym każdy program był wykonywany nie tylko raz, ale 10 razy, „aby zredukować wpływ zimnego startu i efektów pamięci podręcznej, a także aby móc przeanalizować spójność pomiarów i uniknąć wartości odstających.” (Z tego powodu donoszą, że „zmierzone wyniki są dość spójne”). Dla zwiększenia spójności, wszystkie testy zostały przeprowadzone na komputerze stacjonarnym z systemem Linux Ubuntu Server 16.10 (wersja jądra 4.8.0-22-generic), z 16GB pamięci RAM i procesorem Haswell Intel Core i5-4460 3.20GHz.

W swoim artykule, badacze podają kilka interesujących wyników.

„Lisp, średnio, zużywa 2.27x więcej energii (131.34J) niż C, zabierając przy tym 2.44x więcej czasu na wykonanie (4926.99ms) i 1.92x więcej pamięci (126.64Mb) potrzebnej w porównaniu do Pascala.”

Porównali oni również wyniki z języków skompilowanych w porównaniu do języków interpretowanych (z oddzielną kategorią dla języków, które działają na maszynach wirtualnych). Dokument zawiera również oddzielne porównanie różnych paradygmatów programowania – w tym zarówno programowania funkcyjnego, jak i imperatywnego, a także programowania obiektowego i skryptów.

Czy szybszy program jest bardziej ekologiczny?

Papier przyjrzał się powszechnemu założeniu, że szybszy program zawsze będzie zużywał mniej energii, wskazując, że nie jest to tak proste jak prawo fizyki, które mówi, że E(nergia) = T(ime) x P(ower). Jest to częściowo spowodowane tym, że energia nie jest wydatkowana w stałym tempie, zauważają naukowcy, sugerując, że może to mieć wpływ na pracę innych badaczy analizujących, czy czas działania programu wpływa na jego zużycie energii. („Wnioski dotyczące tej kwestii czasami się rozbiegają…”) W jednym z testów porównawczych, program Chapel potrzebował 55% mniej czasu na wykonanie niż równoważny program napisany w Pascalu – a jednak ten program Pascala zużywał 10% mniej energii.

Więc, podczas gdy nadal istnieje powszechne przekonanie, że zużycie energii spada, gdy programy działają szybciej, badacze stwierdzają jednoznacznie, że „szybszy język nie zawsze jest najbardziej wydajny energetycznie.”

Odpowiedź na to pytanie może być trudna, ponieważ na zużycie energii wpływa wiele czynników (w tym jakość kompilatora i używane biblioteki). Ale ostatecznie badacze byli nawet w stanie rozbić zużycie energii na podstawie tego, czy była ona zużywana przez CPU czy DRAM – dochodząc do wniosku, że większość energii (około 88 procent) była zużywana przez CPU, średnio, niezależnie od tego, czy program benchmarkowy był kompilowany, interpretowany czy uruchamiany na maszynie wirtualnej.

Co ciekawe, języki interpretowane wykazały nieco większą zmienność, z CPU czasami zużywającym aż 92.90 procent mocy lub tak mało jak 81,57 procent.

Po przestudiowaniu swoich wyników badacze doszli również do wniosku, że związek pomiędzy szczytowym wykorzystaniem DRAM a zużyciem energii „prawie nie istnieje.”

Badania te dostarczają kilku dodatkowych spostrzeżeń na odwieczne pytanie: czy szybsze jest bardziej ekologiczne? Tak, to prawda, że „pierwsza piątka najbardziej energooszczędnych języków utrzymuje swoją pozycję, gdy są one sortowane według czasu wykonania i przy bardzo małych różnicach zarówno w wartości energii, jak i czasu.”

W rzeczywistości, dla dziewięciu z 10 problemów benchmarkowych, najlepszy wynik (zarówno dla prędkości, jak i efektywności energetycznej) pochodził z jednego z trzech najszybszych i najbardziej energooszczędnych języków – co nie zaskoczyło badaczy. „Powszechnie wiadomo, że te trzy najlepsze języki (C, C++ i Rust) są silnie zoptymalizowane i wydajne pod względem wydajności wykonania, co pokazują również nasze dane.”

Ale nie widać tego samego porządku, gdy uszeregujesz pozostałe 24 języki według ich czasu wykonania, jak to ma miejsce, gdy uszeregujesz je pod względem wydajności energetycznej. „Tylko cztery języki zachowują tę samą rangę energetyczną i czasową (OCaml, Haskel, Racket i Python), podczas gdy pozostałe są całkowicie wymieszane.”

I nawet w poszczególnych testach porównawczych istnieją przypadki, w których szybko działające języki nie są najbardziej wydajne energetycznie.

Zalety języków kompilowanych

Były też inne interesujące wyniki. Języki kompilowane „mają tendencję do bycia” najbardziej energooszczędnymi i najszybciej działającymi – a ich dokument może nawet określić tę różnicę za pomocą liczby. „Średnio, języki kompilowane zużywały 120J na wykonanie rozwiązań, podczas gdy dla maszyny wirtualnej i języków interpretowanych wartość ta wynosiła odpowiednio 576J i 2365J.”

Badacze zastosowali tę samą precyzję przy porównywaniu czasów wykonania, stwierdzając, że średnio „języki kompilowane zajęły 5103ms, języki maszyny wirtualnej zajęły 20623ms, a języki interpretowane 87614ms.”

Z pięciu najlepszych języków w obu kategoriach, cztery z nich były kompilowane. (Wyjątek? Java.)

Zużyta energia Run-
Ada 98J 3740 ms
Java 114J 3821 ms

Pięć najwolniejszych języków było wszystkie interpretowane: Lua, Python, Perl, Ruby i Typescript. A pięć języków, które zużywały najwięcej energii, również było interpretowanych: Perl, Python, Ruby, JRuby i Lua.

Ale jednocześnie, podczas manipulowania ciągami znaków za pomocą wyrażeń regularnych, trzy z pięciu najbardziej energooszczędnych języków okazują się być językami interpretowanymi (TypeScript, JavaScript i PHP), „chociaż mają tendencję do bycia niezbyt wydajnymi energetycznie w innych scenariuszach.”

Języki kompilowane zajęły również pięć pierwszych miejsc pod względem najmniejszej ilości wykorzystywanego miejsca w pamięci.

.

Język Potrzebne miejsce w pamięci
Pascal 66Mb
Go 69Mb
C 77Mb
Fortran 82Mb
C++ 88Mb

„Średnio, języki kompilowane potrzebowały 125Mb, języki maszyny wirtualnej 285Mb, a interpretowane 426Mb” – relacjonują badacze. Tymczasem języki interpretowane zajęły cztery z pięciu najniższych miejsc, co oznacza, że zużywały najwięcej miejsca w pamięci: JRuby, Dart, Lua i Perl. (Podczas gdy Erlang nie jest językiem interpretowanym, również pojawiłby się w dolnej piątce, pomiędzy Dart i Lua).

„Jeśli posortować je według paradygmatu programowania, języki imperatywne potrzebowały 116Mb, obiektowe 249Mb, funkcyjne 251Mb, a w końcu skryptowe potrzebowały 421Mb.”

W rzeczywistości, gdy porównywano różne paradygmaty, programowanie imperatywne często wychodziło na wierzch. Jego programy wzorcowe również zużywały średnio znacznie mniej energii – i działały znacznie szybciej – niż programy wzorcowe dla paradygmatów zorientowanych obiektowo, funkcjonalnych i skryptowych.

.

Zużyta energia Run-time
Imperatywny 125J 5585ms
Object-Oriented 879J 32965ms
Functional 1367J 42740ms
Scriptura 2320J 88322 ms

Ale jest wiele czynników do rozważenia. „Jest jasne, że różne paradygmaty programowania, a nawet języki w ramach tego samego paradygmatu mają zupełnie inny wpływ na zużycie energii, czas i pamięć” – piszą badacze. Jednak to, który z nich jest najważniejszy, zależy od Twojego scenariusza. (Na przykład zadania w tle nie zawsze wymagają najszybszego czasu działania…)

A niektóre aplikacje wymagają uwzględnienia dwóch czynników – na przykład zużycia energii i czasu wykonania. W takim przypadku „C jest najlepszym rozwiązaniem, ponieważ jest dominujący w obu pojedynczych celach” – piszą badacze. Jeśli próbujesz zaoszczędzić czas, a jednocześnie zużywasz mniej pamięci, C, Pascal i Go „są równoważne” – i to samo jest prawdą, jeśli obserwujesz wszystkie trzy zmienne (czas, zużycie energii i użycie pamięci). Ale jeśli próbujesz po prostu oszczędzać energię, używając mniej pamięci, najlepszym wyborem jest C lub Pascal.

Najlepsze języki dla konkretnych scenariuszy (zrzut ekranu z pracy badawczej)
Na końcu pracy badacze dodają, że w dalszych badaniach chcieliby sprawdzić, czy całkowite użycie pamięci w czasie lepiej koreluje z zużytą energią.

Oni dzielą się swoimi danymi online, sugerując, że ułatwia to przyszłym badaczom porównanie, na przykład, języków .NET lub języków JVM. Dla programistów pracujących z aplikacjami mobilnymi, systemami Internet-of-Things, lub innymi aplikacjami czerpiącymi z ograniczonych źródeł zasilania, zużycie energii jest głównym problemem.

Ale w końcu, badanie może również pozostawić programistów z rzeczą, której najbardziej nienawidzą: niejednoznacznością. Badacze donoszą, że jeśli szukasz jednego najlepszego języka programowania, „to pytanie nie ma konkretnej i ostatecznej odpowiedzi”.

„Chociaż najbardziej energooszczędny język w każdym benchmarku jest prawie zawsze najszybszy, faktem jest, że nie ma języka, który jest konsekwentnie lepszy od innych”, konkludują badacze. „Sytuacja, w której dany język będzie używany, jest kluczowym aspektem do określenia, czy jest to najbardziej energooszczędna opcja.”

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.