Nachhaltigkeit ist besondern im Bereich des Software-Designs ein vielschichtiges Thema. Das Karlskrona Manifest für nachhaltiges Design von Software unterscheidet beispielsweise ökonomische, ökologische, technologische, soziale und zusätzlich individuelle Nachhaltigkeit. Diese unterschiedlichen Dimensionen sind eng verbunden mit dem Energieverbrauch von IT-Systemen, was zu einer komplexen Ursache-Wirkungskette führt, die es zu verstehen gilt.

Aktuell liegt unser Fokus meist auf der umweltbezogenen Nachhaltigkeit von IT-Systemen. Genauer auf dem CO2-Fußabdruck und dem Energieverbrauch. Ein hoher Energieverbrauch kann zu hohen Kosten führen und die ökonomische Nachhaltigkeit beeinträchtigen. Dabei kann der Energieverbrauch eines IT-Systems durch verschiedene Faktoren beeinflusst werden.

Nehmen wir als Beispiel die Programmiersprache eines Softwaresystems. Die Wahl einer ungünstigen Programmiersprache kann zu einem höheren Energieverbrauch eines IT-Systems führen. So kann ein PHP-Programm bis zu 30-mal mehr Energie verbrauchen und auch eine 30-mal längere Ausführungszeit haben als sein in Rust geschriebenes Gegenstück.

Warum sollte die verwendete Programmiersprache eine Rolle beim Energieverbrauch meines IT-Systems spielen? Das sind doch immer Schleifen und Verzweigungen, egal in welcher Sprache.

Das mag grundsätzlich korrekt sein. Dennoch hängt die Energieeffizienz einer Programmiersprache von verschiedenen Kriterien ab, darunter

  • Threading Modell
  • Interpreter- oder Compilersprache
  • Optimierungsoptionen
  • Unterstützung asynchroner Programmiermodelle
  • Speicherbedarf
  • Speicherverwaltung
  • Ausführungsgeschwindigkeit
  • Umfang von verwendeten Bibliotheken
  • Portabilität (Übertragbarkeit)
  • Verwendung energieeffizienter Schnittstellen und Protokolle

Diese Aspekte werden in den folgenden Abschnitten jeweils kurz beschrieben.

Welche Rolle spielt das Threading-Modell?

Ob eine Programmiersprache Single-Threaded arbeitet oder Multi-Threading unterstützt, ist solch ein Kriterium. Ein Thread meint hier einen Ausführungsstrang im Programmcode.

In der Vergangenheit wurden IT-Anwendungen häufig in COBOL und Fortran entwickelt. Viele dieser Anwendungen werden z. B. im Banken- und Versicherungssektor immer noch verwendet. Sowohl COBOL als auch Fortran arbeiten Single-Threaded. Sie werden auf funktionaler Ebene also strikt sequenziell ausgeführt. Diese sequenzielle Abarbeitung von Code führt in Folge zu einer eher langsamen Ausführungsgeschwindigkeit.

Um dennoch viele Anfragen an ein solches IT-System bewältigen zu können, wird auf sehr leistungsfähige, aber auch sehr teure und energieineffiziente Großrechner zurückgegriffen.

Modernere Programmiersprachen wie C++, Java oder Go unterstützen Multi-Threading und können mehrere Funktionen gleichzeitig ausführen. In solchen Programmiersprachen entwickelte IT-Anwendungen sind prinzipiell auf preiswerterer und virtualisierter Hardware lauffähig.

Für die Wahl einer Programmiersprache kann es auch eine Rolle spielen, wie stark der Bedarf für parallele Verarbeitung oder Multi-Threading überhaupt ist.

Single-Threaded, aber auch nicht

Einige modernere Programmiersprachen wie JavaScript oder node.js laufen im Browser generell Single-Threaded (sequenziell) ab. Sie können aber durch Konzepte wie Async/Await, Promises oder Web Worker ebenfalls mehrere Aufgaben parallel bearbeiten.

Wie energieintensiv sind Interpreter- oder Compiler-Sprachen?

Interpreter führen den Quellcode direkt aus, ohne ihn zu kompilieren. Dies kann zu höherem Energieverbrauch führen, da der Interpreter den Code während der Ausführung analysieren und interpretieren muss. Der Code wird in Echtzeit ausgeführt, was zusätzliche CPU-Ressourcen verbrauchen kann.

Compiler-Sprachen übersetzen den Quellcode in Maschinencode, der direkt von der verwendeten Hardware ausgeführt wird. Der Code wird bereits vor der Ausführung optimiert. Dies kann zu einer schnelleren Ausführung und einer insgesamt geringeren CPU-Belastung führen. So sind kompilierte Programme in der Regel energieeffizienter und meist auch schneller als interpretierte Programme.

Wie entscheidend ist Code-Optimierung?

Die Fähigkeit zur Code-Optimierung kann den erzeugten Maschinencode verbessern,  zum Beispiel die Verwendung von Inline-Funktionen, Loop-Optimierungen und Compiler-/Interpreter-Optimierungen.  Dies kann IT-Anwendungen energieeffizienter machen.

Warum asynchrone Programmiermodelle beim Energiesparen helfen

Programmiersprachen mit nativer Unterstützung für asynchrone Programmiermodelle können nicht blockierende Operationen erleichtern, was die CPU entlastet, während auf externe Ressourcen gewartet wird. Dies kann zu einem geringeren Energieverbrauch führen gegenüber Programmiersprachen, die nur synchrone und damit blockierende Programmiermodelle unterstützen.

Speicherbedarf als wichtiger Faktor für Energieeffizienz

Programmiersprachen mit einem niedrigen Speicherbedarf nutzen den verfügbaren Speicher offenbar effizienter als andere Sprachen. Das kann dazu beitragen, den Bedarf an RAM innerhalb einer IT-Anwendung zu reduzieren und ihren Energieverbrauch zu minimieren. Dieser Aspekt ist unter anderem auf Geräten mit begrenztem Speicher wie Mobiltelefonen oder IoT-Devices relevant.

Speicherverwaltung

Der Speicherbedarf einer Programmiersprache hängt stark von der Methodik ab, mit der der Speicher verwaltet wird. Sprachen mit automatischer Speicherbereinigung (Garbage Collection) übernehmen das Management nicht mehr benötigter Speicherressourcen. Eine effiziente Garbage Collection minimiert den Speicherverbrauch und kann so den Energieverbrauch der IT-Anwendung reduzieren, indem dann unnötige Speicheroperationen vermieden werden.

Ausführungsgeschwindigkeit als Maß für Energieeffizienz

Leider können wir den Energieverbrauch einer Programmiersprache in einem bestimmten Kontext oft gar nicht genau messen. Als Stellvertreter für die Feststellung des Energieverbrauchs dient uns deshalb häufig die Performance .

Eine höhere Ausführungsgeschwindigkeit einer IT-Anwendung bedeutet normalerweise, dass Aufgaben schneller erledigt werden können. Das führt zu einer kürzeren aktiven Laufzeit. Folglich wird weniger Energie verbraucht.

Dieser Zusammenhang mag nicht in jedem Fall stimmen, ist aber einer der besten Indikatoren für Energieeffizienz, den wir im Moment haben.

Umfangreiche Bibliotheken als Energiefresser

Umfang und Inhalt von Laufzeitbibliotheken können den Energieverbrauch einer IT-Anwendung ebenfalls beeinflussen.

Auf der einen Seite können große, umfassende Bibliotheken die Größe einer IT-Anwendung erhöhen und zusätzliche Ressourcen während der Ausführung beanspruchen. Auf der anderen Seite können gut optimierte Bibliotheken den Bedarf an benutzerdefiniertem Code verringern. Das führt zu geringerer Ausführungszeit und somit zu einer geringeren Energieaufnahme.

Wenn eine IT-Anwendung lokal oder in der Cloud neu ausgeliefert und gestartet werden soll, bestimmt beispielsweise die Größe der Anwendung die Startdauer und den Stromverbrauch der IT-Anwendung beim Start.

Zur horizontalen Skalierung und zur Gewährleistung hoher Verfügbarkeit werden Service-Instanzen in der Cloud üblicherweise mehrfach parallel gestartet. Dabei summiert sich die Startzeit über alle Instanzen und folglich die für den Start verbrauchte Energie schnell zu größeren Zahlen auf.

Deshalb gilt: Je schneller ein Service startet, desto weniger Energie wird für den Start verbraucht.

Portabilität bzw. multiple Plattformunterstützung sind von Vorteil

Programmiersprachen, die auf einer Vielzahl von Plattformen und Betriebssystemen lauffähig sind, ermöglichen es, energieeffiziente Anwendungen für verschiedene Geräte und Umgebungen zu entwickeln. Außerdem kann eine IT-Anwendung für eine bestimmte Plattform kompiliert und optimiert werden, so dass für diese Plattform eine optimale Ressourcen-Nutzung ermöglicht wird.

Welche Schnittstellen und Protokolle sind zu empfehlen?

Grundsätzlich gilt: Je moderner je effizienter! Moderne Programmiersprachen bzw. deren neueren Versionen nutzen auch moderne Protokolle und Schnittstellen. Nehmen wir als Beispiel HTTP/2:

Bei Verwendung von Programmiersprachen bzw. deren Versionen, die das Protokoll HTTP/2 unterstützen, lassen sich Dauer und Datenvolumen beim Datenaustausch gegenüber HTTP/1.1 u.a. durch Header-Komprimierung um ca. ein Neuntel reduzieren.

Java unterstützt HTTP/2 beispielsweise seit der Version 9. Läuft eine IT-Anwendung noch in Java 8, kann HTTP/2 vermutlich nur über Drittbibliotheken verwendet werden. Go unterstützt HTTP/2 seit Version 1.6, Python unterstützt HTTP/2 seit Version 3.6.0. Je älter die Sprachversion einer IT-Anwendung ist, desto unwahrscheinlicher ist die Fähigkeit zur Verwendung von HTTP/2.

HTTP/2 wurde bereits 2015 als Standard verabschiedet. Bereits seit Juni 2022 gibt es HTTP/3 als vorgeschlagenen Standard. Diese Version verspricht gegenüber HTTP/2 eine weitere Effizienzsteigerung u. a. durch die Verwendung von QUIC anstelle von TCP als zugrunde liegendem Netzwerkprotokoll.

Ausgehend vom Beispiel HTTP/2 fallen Eigenschaften moderner Schnittstellentechnologien und Protokollen wie Komprimierung, effiziente Verschlüsselung, Verwendung optimierter Datenformate oder auch die Nutzung von Caching Optionen ein, die bei Verwendung eine deutlich höhere Energieeffizienz versprechen.

Die Liste ist lang …

Es gibt also eine Reihe von Indikatoren, an denen sich ablesen lässt, ob eine Programmiersprache energieeffizienter ist als eine andere. Dies war nur ein Anfang. Wer sich tiefer informieren möchte, findet hier weitere Quellen:

Energy Efficiency across Programming Languages

Die beste Quelle ist vermutlich Energy Efficiency across Programming Languages. Hier wurden der Energieverbrauch und die Ausführungsdauer typischer Algorithmen für 27 gebräuchliche Programmiersprachen gemessen. Allerdings stammt die Auswertung aus dem Jahr 2017 und ist somit heute mit Bedacht zu interpretieren.

In diesem Dokument wurde beispielsweise festgestellt, dass Java-Programme im untersuchten Kontext etwa doppelt so viel Energie und Zeit verbrauchten wie ihr Pendant in C oder Rust. Mit Python und Perl wurde sogar mehr als das 75-fache an Energie und  Zeit verbraucht als mit C und Rust.

Web Framework Benchmarks

Eine neuere und jährlich aktualisierte Quelle sind die Web Framework Benchmarks. Diese Messreihe legt einen Schwerpunkt auf die Performance von Web Frameworks. Dabei basieren die untersuchten Frameworks meist auf einer oder mehreren etablierten Programmiersprachen.

Spring und Quarkus liegt beispielsweise die Programmiersprache Java zu Grunde. Das Webserver-Framework salvo wird auf Basis der Sprache Rust entwickelt.

Unter der Annahme, dass eine hohe Geschwindigkeit eine effiziente Ressourcen-Nutzung und damit auch Energieeffizienz bedeutet, lassen sich so Rückschlüsse auf die Energieeffizienz einzelner Programmiersprachen treffen.

Programming Language Benchmark Game

Eine dritte Quelle ist das Programming Language Benchmark Game, das sich inhaltlich sehr nah an den oben genannten Energy Efficiency across Programming Languages orientiert. Lediglich die Programmiersprachen Hack, TypeScript und JRuby wurden mit Julia und Smalltalk ersetzt. Das Repository des Benchmark Games wird immerhin ein bis zweimal pro Jahr aktualisiert.

Hilfe, meine Programmiersprache ist ein Klima-Killer!

Ich habe da eine IT-Anwendung, die ein echter Klima-Killer sein muss. Die ist in Python geschrieben und das ist ja eine echt langsame Interpreter Sprache ist. Und sie braucht außerdem echt lange, um diese monatliche Berechnung durchzuführen. Da sollte ich die Anwendung neu schreiben lassen. Am besten in C oder Rust

Bitte nicht so schnell!

Es kann gut sein, dass die aktuelle Lösung in Python eine ausgezeichnete Energieeffizienz gegenüber anderen Lösungen aufweist. Python ist zwar eine interpretierte Sprache. Sie verwendet aber im Hintergrund häufig Bibliotheken, die zumindest teilweise unter Benutzung effektiver Compilersprachen wie C oder C++ erstellt wurden. Im Umfeld von Maschinellem Lernen und Künstlicher Intelligenz gehören dazu beispielsweise diese Bibliotheken:

Fazit

Nur weil eine IT-Anwendung auf einer Interpreter-Sprache basiert, muss sie keine Energieschleuder sein und neu geschrieben werden. Die verwendete Programmiersprache ist einer von mehreren Aspekten, die den Energieverbrauch einer IT-Anwendung beeinflussen. Also nur ein Aspekt von vielen. Auf weitere Einflussfaktoren wie z. B. übertragene Datenmengen, die Entfernung zwischen Benutzern und Servern oder Nutzungsfrequenz von Services und Anwendungen oder deren Nutzungsdauer wird es in späteren Posts gehen. Also am besten ab und zu mal reinschauen.

Alle Beiträge von Ramon Anger

Seit über 25 Jahren Software Architekt und Entwickler von ganzem Herzen.

Schreibe einen Kommentar