Green IT: Energieeffizienz messen und die richtige Software auswählen

Seite 2: Die Analyse der Details

Inhaltsverzeichnis

Dem Messen der Software können weitere Analysen folgen, die etwa der Frage nachgehen, wie sich die Effizienz steigern ließe. Infrage kämen dazu der Austausch von Teilen des Softwarestacks oder einzelner Bibliotheken, Algorithmen oder das Analysieren der Versionshistorie. Das Logging der Zeitstempel zu Beginn und Ende einer Softwareaktivität erlaubt zudem tiefer gehende Einblicke in die Lastprofile: Beispielsweise untersuchte das Team den Energieverbrauch auf Funktionsebene für grep oder die Entwicklung des Energieverbrauchs über die Trainingsepochen eines Convolutional Neural Network.

Wer ressourceneffiziente Software entwickeln möchte, kommt um eine Analyse ihrer Bestandteile kaum herum. Als Erstes ist die eingesetzte Programmiersprache zu betrachten. Ihre Wahl richtet sich nach Anwendungsgebiet, Zweck und Arbeitsumfang. Bereits hier können kleine Anpassungen große Auswirkungen auf die Ressourceneffizienz haben, etwa bei der Wahl der Bibliotheken.

Beispielhaft sollen in Python zuerst ein Array sortiert und dann Zufallszahlen generiert werden. Die erste Aufgabe bewältigen zum einen die Standard-Python-Funktion range() in einer for-Schleife und zum anderen die Funktionen np.sum und np.arange aus der Python-Bibliothek NumPy. NumPy ist auf die einfache Handhabung großer mehrdimensionaler Arrays spezialisiert und stellt neben den Datenstrukturen auch effizient implementierte Funktionen für numerische Berechnungen bereit. Bei der zweiten Aufgabe treten die Python-Standardfunktion random.randint() und die NumPy-Funktion np.random.randint() gegeneinander an.

Das folgende Listing zeigt alle vier Codeschnipsel, in denen die Funktionen je 100 Millionen Werte bearbeiten.

Listing: Die vier Codeschnipsel für die Leistungsmessung

# Standard-for-Schleife:
standard_sum = 0
for i in range(100000000):
 standard_sum = standard_sum + i

# NumPy-Funktionen sum und arange
import numpy as np
np_sum = np.sum(np.arange(100000000))

# Standard-Funktion randint
arr = [random.randint(0, 100) for p in range(1, 100000000)]

# NumPy-Funktion randint
np_arr = np.random.randint(low = 0, high = 100, size = (100000000,))

In dem beschriebenen Messaufbau wurden die Codeschnipsel ausgeführt und die Leistungsdaten aufgenommen. Mit den NumPy-Funktionen beträgt der Energieverbrauch beim Addieren eines Arrays nur 2,3 Prozent und beim Generieren der Zufallszahlen sogar nur 1,18 Prozent dessen, was bei den Standardversionen anfällt.

Die Leistungsmessung verrät, wie effizient die Standard-Python- und NumPy-Funktionen arbeiten.

Diese enorme Zeit- und Energieeinsparung ist der Tatsache geschuldet, dass NumPy in C implementiert ist und damit wesentlich besser mit den Hardwareressourcen haushalten kann als der native Python-Code.

Das zeigt, dass nicht nur spezifische Codeabschnitte, sondern auch die Wahl geeigneter Frameworks Vor- und Nachteile bieten kann. In Sachen Ressourceneffizienz bilden die Frameworks aber oft Blackboxes. Häufig steht zudem das Kriterium der Usability der Wahl des ressourcenschonendsten Frameworks entgegen.

Für einige Sprachen stehen Profiling-Werkzeuge zur Verfügung, mit denen sich ineffiziente Softwarebestandteile ausfindig machen lassen. Beispielsweise kann man mit dem Go Profiler einzelne Threads respektive Channels analysieren und damit einen im Prozessstack besser ausbalancierten Code gestalten.

Der Go Profiler analysiert die CPU-Zeit einzelner Programmschritte.

Es existieren auch erste Plug-ins wie CodeCarbon, die die Energiekosten und den damit verbundenen CO₂-Ausstoß visualisieren. Das Projekt SoftAWere versucht unter anderem, den Verbrauch gängiger Bibliotheken und Tools etwa als Git-Badge sichtbar zu machen. Auch beim Machine Learning gibt es Unterschiede zwischen den Frameworks.

Zur Effizienz eines Produkts zählt aber auch der gesamte Softwarestack. Neben der selbst programmierten Software sind weitere Bestandteile wie Datenbanken oder Webserver in die Analyse des Systems einzubeziehen. Ob es bei der Betrachtung der eigenen Software Grenzen gibt und wo sie liegen, ist dabei diskutabel. Beispielsweise kann die Frage "Spielt es eine Rolle, ob meine Software auf eine ineffiziente API zugreift?" weitere Fragen aufwerfen.