Kompakter Code und energieeffiziente Software

In den dunklen Zeiten, als die Mikroprozessorchips gerade erst erfunden worden waren, bekamen Studenten der Ingenieurwissenschaften ihre ersten Erfahrungen mit dem Programmieren von Computern oft auf Maschinen wie dem Minicomputer DEC PDP-11. Neben dem Versuch, Programme zu schreiben, die auf der PDP-11 tatsächlich korrekt liefen, mussten die Studenten von damals ihren Code auch kompakt gestalten. Ein Weg, um in den frühen Computerkursen verärgerte Blicke von Lehrern zu ernten, bestand darin, Programme einzureichen, die 20 Zeilen Assemblercode benötigten, aber in 15 hätten erledigt werden können. Der Grund für ihre Verärgerung war natürlich, dass Speicher teuer war. Die PDP-11 hatte typischerweise nur 4096 16-Bit-Worte an Lese-/Schreibspeicher, der aus 22-Mil-Magnetkernen bestand, auf die über Drähte zugegriffen wurde.

Ein PDP-11-Computer der Digital Equipment Corporation (DEC). (Bildquelle: flickr)

In der heutigen Zeit wird in Programmierkursen immer noch Wert auf kompakten Code gelegt. Es gibt jedoch Anzeichen dafür, dass der Schwerpunkt der Programmierkurse bald nicht mehr nur auf dem Schreiben von kompaktem Code, sondern auch auf dem Schreiben von Software liegen könnte, die den Energieverbrauch minimiert.

Die Energieeffizienz von Computercodes war einst ein Nischenthema. Sie war vor allem für Programmierer von kleinen eingebetteten Systemen interessant, bei denen die Verlustleistung einer MCU möglichst gering gehalten werden musste, um die Lebensdauer der Knopfzelle, die den Strom liefert, zu maximieren. Jetzt wird die Energieeffizienz von Software zum Mainstream. Es kommt immer häufiger vor, dass Smartphone-Benutzer auf rechenintensive Anwendungen verzichten, um den Akku des Telefons zu schonen. Selbst bei Cloud-basierten Systemen wird auf die Energieeffizienz von Software geachtet, da sie sich auf die Kohlenstoffemissionen von Rechenzentren auswirkt.

Auf den ersten Blick könnte man vermuten, dass kompakter Code bereits energieeffizient ist. Es hat sich herausgestellt, dass diese Faustregel auch manchmal zutrifft, aber eben nicht immer. Außerdem hängt die Energieeffizienz eines Computerprogramms im Allgemeinen von der Sprache ab, in der es geschrieben ist. Kompilierte Sprachen sind energieeffizienter als interpretierte Sprachen oder solche, aus denen virtuelle Maschinen bestehen. Aber selbst bei kompilierten Sprachen, die miteinander verwandt zu sein scheinen, kann es große Unterschiede in der Energieeffizienz geben.

Erkenntnisse darüber, wie Energie, Zeit und Speicherverbrauch mit energieeffizienter Programmierung zusammenhängen, stammen aus Arbeiten von Forschern in Portugal (https://dl.acm.org/doi/10.1145/3136014.3136031). Sie analysierten die Leistung von 27 Programmiersprachen im Hinblick auf ihre Energieeffizienz. Dazu verwendeten sie modernste Compiler, Interpreter und virtuelle Maschinen und beobachteten, was passierte, wenn sie 13 verschiedene Programme ausführten, um zu vergleichen, wie weit verbreitete Algorithmen in verschiedenen gängigen Programmiersprachen implementiert werden können.

Ein Benchmark-Programm hat zum Beispiel die Zeit gemessen, die für die Berechnung der Wechselwirkung zwischen mehreren Teilchen in einem System benötigt wurde. Ein anderer wies viele Binärbäume zu und gab sie wieder frei. Ein dritter aktualisierte eine Hash-Tabelle und nutzte sie, um bestimmte DNA-Nukleotidsequenzen zu zählen.

Die Forscher weisen darauf hin, dass es einen weit verbreiteten Irrglauben gibt, dass der Energieverbrauch von Software proportional zur Ausführungszeit ist: Schneller ist immer besser. Eine Verkürzung der Ausführungszeit eines Programms würde also seinen Energieverbrauch im gleichen Verhältnis verringern. Aber die Beziehung ist nicht unbedingt einfach, denn die verbrauchte Energie ist das Produkt aus verbrauchter Leistung und Zeitdauer. Ein schnelleres Programm ist also nicht unbedingt energieeffizienter, wenn es während der Ausführung mehr Strom verbraucht.

Infolgedessen fanden die Forscher mehrere Fälle, in denen sich der Grad des Energieverbrauchs einer Programmiersprache von dem ihrer Ausführungszeit unterschied. So erwies sich Fortran bei einem Benchmark, bei dem es um das Erzeugen und Schreiben zufälliger DNA-Sequenzen ging, als die zweit-effizienteste Sprache, obwohl sie bei der Ausführungszeit nur an achter Stelle lag. Und bei der Berechnung von Binärbäumen lag der Energieverbrauch von Pascal und Chapel innerhalb von 10 %, obwohl Chapel etwa 55 % weniger Zeit zur Ausführung benötigt.

Einige der Schlussfolgerungen der Forscher sind nicht überraschend. Ein Ergebnis: Die Sprache C ist insgesamt am schnellsten und energieeffizientesten (57 J, durchschnittliche Ausführungszeit 2019 msec). Nach C sind die vier Sprachen mit dem geringsten Energie- und Zeitbedarf für die Ausführung der Benchmarks Rust (59 J, 2103 msec), C++ (77 J, 3155 msec), Ada (98 J, 3740 msec) und Java (114 J, 3821 msec). Und wie zu erwarten war, waren kompilierte Sprachen weitaus energieeffizienter als interpretierte oder virtuelle Maschinensprachen. Kompilierte Programme verbrauchten durchschnittlich 120 J für die Ausführung der Lösungen, während virtuelle Maschinen und interpretierte Sprachen 5760 J bzw. 2365 J verbrauchten.

Es überrascht daher nicht, dass die fünf untersten Sprachen in Bezug auf Energieeffizienz und Ausführungszeit alle interpretiert wurden: Perl (4604 J), Python (4390 J), Ruby (4045 J), JRuby (2693 J) und Lua (2660 J) bei der Energie; Lua (167416 msec), Python (145178 msec), Perl (132856 msec), Ruby (119832 msec) und TypeScript (93292 msec) bei der Zeit.

Die Forscher zeigten auch, wohin der größte Teil der abgeleiteten Energie fließt. Der CPU-basierte Energieverbrauch macht immer den größten Teil der verbrauchten Energie aus. Im Durchschnitt verbraucht die CPU fast 90 % der Energie, der Rest entfällt auf den DRAM, unabhängig davon, ob die Sprache kompiliert, interpretiert oder virtuell ist.

Alles in allem, so die portugiesischen Forscher, ist es relativ einfach, sich für die beste Programmiersprache zu entscheiden, wenn die Entwickler nur auf die Ausführungszeit und den Energieverbrauch achten. Aber die Entscheidung fällt nicht automatisch, wenn auch der Speicherbedarf eine Rolle spielt.

Für den Planeten gibt es also eine gute Nachricht: Es ist möglich, Software für Energieeffizienz zu optimieren. Für Studenten, die programmieren lernen, gibt es eine schlechte Nachricht: Sie können jetzt von ihrem Programmierlehrer nicht nur für ein unzureichend kompaktes Programm, sondern auch für eines, das nicht energieeffizient ist, einen bösen Blick ernten.

Über den Autor

Image of Lee Teschler

Lee Teschler is the Executive Editor of the Design World network of websites, online resources and print publications. Leland (Lee) Teschler worked at Penton Media for 37 years, starting in 1977 as a Staff Editor for Machine Design, and worked his way up to Chief Editor of the publication in 2006. Prior to that, he had been a communications engineer for the federal government. Teschler holds a B. S. in Engineering and a B. S. in Electrical Engineering from the University of Michigan, and an MBA from Cleveland State University.

More posts by Lee Teschler
 TechForum

Have questions or comments? Continue the conversation on TechForum, Digi-Key's online community and technical resource.

Visit TechForum