Intro
In einem ersten Fachartikel1 sind wir detailliert auf die konkreten Maßnahmen und Entwicklungsmuster für energieeffizientes, ressourcenschonendes Coding (Green Coding) eingegangen. Ein Teilaspekt von Green Coding ist die Frage, wie man Algorithmen energieeffizienter und damit nachhaltiger programmieren kann. Daher ist es essenziell, den Energieverbrauch einer Software und ihrer Einzelkomponenten zu messen.
Green Coding – den Energieverbrauch von Software richtig messen
Um herauszufinden, an welchen Stellen im Sourcecode Energie eingespart werden kann, benötigt man Werkzeuge zum Messen des Energieverbrauchs. Tools, die auf Prozessebene den Energieverbrauch von Software messen, sind beispielsweise bereits in Windows2 integriert. In einen Prozess „hineinsehen“ kann man mit diesen Tools allerdings nicht.
Das bedeutet, dass keinerlei Aussage darüber getroffen werden kann, welche Komponente oder Funktion innerhalb des Prozesses am meisten Energie verbraucht. Doch exakt diese Information ist für Entwickler essenziell.
Wie kann gezielt Richtung Energieeffizienz optimiert werden, wenn der genaue Ansatzpunkt unbekannt ist?
Spezielle Tools, wie zum Beispiel das von msg for banking im Rahmen eines Innovationsprojekts entwickelte Tool jPowerMonitor, überwachen innerhalb laufender Applikationen, welche Funktionen gerade aktiv sind und wie viel CPU-Zeit sie in Anspruch nehmen.
Die enthaltenen Komponenten JUnit-Extension und Java Agent ermöglichen direkte Messungen des Energieverbrauchs auf Unit-Test- beziehungsweise Methoden-Ebene eines beliebigen Java-Prozesses. Einzig ein ausführbares JAR-File wird benötigt – für Server-Anwendungen muss ein Java Agent konfiguriert werden.
Java Agents sind Teil der Java Instrumentation API. Die Instrumentation API3 bietet die Möglichkeit, Java Bytecodes zu ändern sowie dynamisch Code zu einem Programm hinzuzufügen. Beispielsweise nutzen Profiling Tools zur Messung von Performance und Speicherverbrauch Java Agents. jPowerMonitor klinkt sich somit in die laufende Anwendung ein, ohne dass deren Code angepasst beziehungsweise überhaupt vorliegen muss.
Die zur Ermittlung des Energieverbrauchs zusätzlich notwendigen Messdaten, wie zum Beispiel den aktuellen Gesamtverbrauch der CPU in Watt, kann jPower-Monitor nicht selbst abgreifen. Zu diesem Zweck ist eine Schnittstelle implementiert, die Stand heute die beiden Windows-Tools Open Hardware Monitor4 sowie HWiNFO5 anbindet. Mittels CSV-Schnittstelle können durch Konfigurationsanpassungen auch Tools für Linux oder MacOS angebunden werden.
jPowerMonitor bietet darüber hinaus die Möglichkeit, auf die eigenen Funktionen in Java-Programmen zu filtern. Manchmal kann es aber auch interessant sein zu sehen, wie viel Energie die benutzten Frameworks benötigen. Dies ist gerade bei der Erstellung von Prototypen hilfreich, um die energieeffizienteste Bibliothek auszuwählen.
Mit der JUnit-Erweiterung lassen sich beispielsweise zwei Algorithmen, die das gleiche Problem adressieren, hinsichtlich ihres Energieverbrauchs vergleichen.
Beide Erweiterungen schreiben während des Messlaufs den Momentanverbrauch in Watt sowie den kumulierten Energieverbrauch pro Testfall in Wattstunden beziehungsweise pro Methode in Joule in separate CSV-Dateien.
Interpretation der Messergebnisse
Es gilt zu beachten, dass die ermittelten Messwerte nicht eins zu eins den Verbrauch an der Steckdose wiedergeben, da Faktoren wie Verluste der AC/DC-Wandler, Lüfter, GPU-Stromverbrauch etc. nicht berücksichtigt werden. Dennoch gibt jPowerMonitor einen Anhaltspunkt, wie viel Energie einzelne Softwarekomponenten benötigen.
Wie bei allen experimentellen Verfahren gilt, dass wiederholte Messungen die Aussagekraft erhöhen, daher sollten stets mehrere Messläufe unter gleichen Rahmenbedingungen durchgeführt werden. So ist zum Beispiel darauf zu achten, dass während der Messung möglichst keine rechenintensiven Hintergrundprozesse laufen.
Fazit
jPowerMonitor hilft Entwicklern, herauszufinden, an welchen Stellen des eigenen Programms der meiste Strom verbraucht wird. So haben sie die Möglichkeit, den Code im Sinne von Green Coding zu optimieren und zur Reduzierung von CO2-Emissionen beizutragen.
Aktuell ist das Tool exklusiv für Java verfügbar. Das Konzept von jPowerMonitor lässt sich jedoch auf weitere Programmiersprachen übertragen, die Introspektion beziehungsweise Reflection unterstützen, wenngleich die Library für die jeweilige Sprache neu implementiert werden muss.
jPowerMonitor ist seit Anfang März 2023 OpenSource unter der Apache License 2.0 verfügbar und kann bei GitHub bezogen werden.6
