Energieeffiziente Software entwickeln

Last reviewed 2026-10-28 UTC

Dieses Prinzip in der Nachhaltigkeitssäule des Google Cloud Well-Architected Framework enthält Empfehlungen zum Schreiben von Software, die den Energieverbrauch und die Serverlast minimiert.

Übersicht über die Prinzipien

Wenn Sie Best Practices für die Erstellung Ihrer Cloud-Anwendungen befolgen, optimieren Sie die Energie, die von den Cloud-Infrastrukturressourcen (KI, Computing, Speicher und Netzwerk) genutzt wird. Außerdem tragen Sie dazu bei, den Wasserbedarf der Rechenzentren und den Energieverbrauch der Endnutzergeräte beim Zugriff auf Ihre Anwendungen zu reduzieren.

Wenn Sie energieeffiziente Software entwickeln möchten, müssen Sie Nachhaltigkeitsaspekte im gesamten Softwarelebenszyklus berücksichtigen, von Design und Entwicklung bis hin zu Bereitstellung, Wartung und Archivierung. Ausführliche Informationen dazu, wie Sie mit KI Software entwickeln, die die Umweltauswirkungen von Cloud-Arbeitslasten minimiert, finden Sie im E-Book von Google Cloud Software nachhaltig entwickeln.

Empfehlungen

Die Empfehlungen in diesem Abschnitt sind in die folgenden Schwerpunktbereiche unterteilt:

  • Rechenaufwand minimieren: Bevorzugen Sie schlanken, fokussierten Code, der redundante Logik eliminiert und unnötige Berechnungen oder überflüssige Funktionen vermeidet.
  • Effiziente Algorithmen und Datenstrukturen verwenden: Wählen Sie zeit- und speichereffiziente Algorithmen, die die CPU-Last reduzieren und die Speichernutzung minimieren.
  • Computing- und Datenvorgänge optimieren: Entwickeln Sie mit dem Ziel, alle verfügbaren Ressourcen effizient zu nutzen, einschließlich CPU, Arbeitsspeicher, Laufwerk-E/A und Netzwerk. Wenn Sie beispielsweise Busy Loops durch ereignisgesteuerte Logik ersetzen, vermeiden Sie unnötiges Polling.
  • Frontend-Optimierung implementieren: Um den Stromverbrauch von Endnutzergeräten zu reduzieren, verwenden Sie Strategien wie Minimierung, Komprimierung und Lazy Loading für Bilder und Assets.

Rechenaufwand minimieren

Wenn Sie energieeffiziente Software schreiben möchten, müssen Sie die Gesamtzahl der Rechenvorgänge minimieren, die Ihre Anwendung ausführt. Jede unnötige Anweisung, redundante Schleife und zusätzliche Funktion verbraucht Energie, Zeit und Ressourcen. Verwenden Sie die folgenden Empfehlungen, um Software zu entwickeln, die minimale Berechnungen ausführt.

Schlanken, fokussierten Code schreiben

Verwenden Sie die folgenden Ansätze, um minimalen Code zu schreiben, der für die erforderlichen Ergebnisse unerlässlich ist:

  • Redundante Logik und überflüssige Funktionen vermeiden: Schreiben Sie Code, der nur die wesentlichen Funktionen ausführt. Vermeiden Sie Funktionen, die den Rechenaufwand und die Komplexität erhöhen, aber keinen messbaren Wert für Ihre Nutzer bieten.
  • Refaktorieren: Um die Energieeffizienz im Laufe der Zeit zu verbessern, sollten Sie Ihre Anwendungen regelmäßig prüfen, um ungenutzte Funktionen zu identifizieren. Ergreifen Sie Maßnahmen, um solche Funktionen gegebenenfalls zu entfernen oder zu refaktorieren.
  • Unnötige Vorgänge vermeiden: Berechnen Sie einen Wert oder führen Sie eine Aktion erst aus, wenn das Ergebnis benötigt wird. Verwenden Sie Techniken wie die verzögerte Auswertung, bei der Berechnungen so lange verzögert werden, bis eine abhängige Komponente in der Anwendung die Ausgabe benötigt.
  • Lesbarkeit und Wiederverwendbarkeit von Code priorisieren: Schreiben Sie Code, der lesbar und wiederverwendbar ist. Dieser Ansatz minimiert Duplikate und folgt dem DRY-Prinzip (Don't Repeat Yourself), was dazu beitragen kann, den CO₂-Ausstoß bei der Softwareentwicklung und ‑wartung zu reduzieren.

Backend-Caching verwenden

Durch das Backend-Caching wird sichergestellt, dass eine Anwendung nicht wiederholt dieselbe Arbeit ausführt. Eine hohe Cache-Trefferquote führt zu einer fast linearen Reduzierung des Energieverbrauchs pro Anfrage. Verwenden Sie die folgenden Techniken, um Backend-Caching zu implementieren:

  • Häufig verwendete Daten im Cache speichern: Speichern Sie häufig verwendete Daten an einem temporären, leistungsstarken Speicherort. Verwenden Sie beispielsweise einen speicherinternen Caching-Dienst wie Memorystore. Wenn eine Anwendung Daten aus einem Cache abruft, wird die Anzahl der Datenbankabfragen und Laufwerk-E/A-Vorgänge reduziert. Dadurch sinkt die Last auf den Datenbanken und Servern im Backend.
  • API-Antworten im Cache speichern: Speichern Sie die Ergebnisse häufiger API-Anfragen im Cache, um redundante und kostspielige Netzwerkaufrufe zu vermeiden.
  • In-Memory-Caching priorisieren: Speichern Sie Daten im Hochgeschwindigkeitsspeicher (RAM), um langsame Laufwerks-E/A-Vorgänge und komplexe Datenbankabfragen zu vermeiden.
  • Wählen Sie geeignete Cache-Schreibstrategien aus:
    • Bei der Write-Through-Strategie werden Daten synchron in den Cache und den nichtflüchtigen Speicher geschrieben. Diese Strategie erhöht die Wahrscheinlichkeit von Cache-Treffern, sodass der nichtflüchtige Speicher weniger energieintensive Leseanfragen erhält.
    • Die Write-Back-Strategie (Write-Behind) verbessert die Leistung von schreibintensiven Anwendungen. Daten werden zuerst in den Cache geschrieben und die Datenbank wird später asynchron aktualisiert. Diese Strategie reduziert die unmittelbare Schreiblast für langsamere Datenbanken.
  • Intelligente Entfernungsrichtlinien verwenden: Halten Sie den Cache schlank und effizient. Wenn Sie veraltete oder wenig nützliche Daten entfernen und den verfügbaren Speicherplatz für häufig angeforderte Daten maximieren möchten, verwenden Sie Richtlinien wie „Gültigkeitsdauer“ (TTL), „Am weitesten in der Vergangenheit verwendet“ (LRU) und „Am seltensten verwendet“ (LFU).

Effiziente Algorithmen und Datenstrukturen verwenden

Die von Ihnen ausgewählten Algorithmen und Datenstrukturen bestimmen die reine Rechenkomplexität Ihrer Software. Wenn Sie geeignete Algorithmen und Datenstrukturen auswählen, minimieren Sie die Anzahl der CPU-Zyklen und Arbeitsspeichervorgänge, die zum Ausführen einer Aufgabe erforderlich sind. Weniger CPU-Zyklen und Arbeitsspeichervorgänge führen zu einem geringeren Energieverbrauch.

Algorithmen für optimale Zeitkomplexität auswählen

Priorisieren Sie Algorithmen, die das erforderliche Ergebnis in kürzester Zeit erzielen. Dieser Ansatz trägt dazu bei, die Dauer der Ressourcennutzung zu reduzieren. So wählen Sie Algorithmen aus, die die Ressourcennutzung optimieren:

  • Fokus auf die Reduzierung der Komplexität: Berücksichtigen Sie bei der Bewertung der Komplexität nicht nur Laufzeitmesswerte, sondern auch die theoretische Komplexität des Algorithmus. Im Vergleich zum Bubble-Sort reduziert der Merge-Sort beispielsweise die Rechenlast und den Energieverbrauch bei großen Datasets erheblich.
  • Redundante Arbeit vermeiden: Verwenden Sie integrierte, optimierte Funktionen in der von Ihnen gewählten Programmiersprache oder dem Framework. Diese Funktionen werden häufig in einer energieeffizienteren Sprache wie C oder C++ implementiert, sodass sie im Vergleich zu benutzerdefinierten Funktionen besser für die zugrunde liegende Hardware optimiert sind.

Datenstrukturen für mehr Effizienz auswählen

Die von Ihnen ausgewählten Datenstrukturen bestimmen die Geschwindigkeit, mit der Daten abgerufen, eingefügt oder verarbeitet werden können. Diese Geschwindigkeit wirkt sich auf die CPU- und Arbeitsspeichernutzung aus. So wählen Sie effiziente Datenstrukturen aus:

  • Für Suche und Abruf optimieren: Für gängige Vorgänge wie das Prüfen, ob ein Element vorhanden ist, oder das Abrufen eines bestimmten Werts sollten Sie Datenstrukturen bevorzugen, die für Geschwindigkeit optimiert sind. Beispielsweise ermöglichen Hash-Maps oder Hash-Sets Suchvorgänge in nahezu konstanter Zeit, was ein energieeffizienterer Ansatz ist als die lineare Suche in einem Array.
  • Speicherbedarf minimieren: Effiziente Datenstrukturen tragen dazu bei, den Gesamtspeicherbedarf einer Anwendung zu reduzieren. Weniger Speicherzugriffe und eine geringere Speicherverwaltung führen zu einem niedrigeren Stromverbrauch. Außerdem ermöglicht ein schlankeres Speicherprofil eine effizientere Ausführung von Prozessen, sodass Sie Ressourcenupgrades verschieben können.
  • Spezialisierte Strukturen verwenden: Verwenden Sie Datenstrukturen, die speziell für ein bestimmtes Problem entwickelt wurden. Verwenden Sie beispielsweise eine Trie-Datenstruktur für die schnelle Suche nach Stringpräfixen und eine Prioritätswarteschlange, wenn Sie nur auf den höchsten oder niedrigsten Wert effizient zugreifen müssen.

Computing- und Datenvorgänge optimieren

Konzentrieren Sie sich bei der Softwareentwicklung auf eine effiziente und verhältnismäßige Ressourcennutzung im gesamten Technologie-Stack. Behandeln Sie CPU, Arbeitsspeicher, Laufwerk und Netzwerk als begrenzte und gemeinsam genutzte Ressourcen. Die effiziente Nutzung von Ressourcen führt zu spürbaren Kostensenkungen und einem geringeren Energieverbrauch.

CPU-Auslastung und Inaktivitätszeit optimieren

Mit den folgenden Ansätzen können Sie die Zeit minimieren, die die CPU in einem aktiven, energieverbrauchenden Zustand verbringt, ohne sinnvolle Arbeit zu leisten:

  • Ereignisgesteuerte Logik gegenüber Abfragen bevorzugen: Ersetzen Sie ressourcenintensive Schleifen oder ständige Abfragen durch ereignisgesteuerte Logik. Eine ereignisgesteuerte Architektur sorgt dafür, dass die Komponenten einer Anwendung nur dann ausgeführt werden, wenn sie durch relevante Ereignisse ausgelöst werden. Dieser Ansatz ermöglicht die On-Demand-Verarbeitung, sodass kein ressourcenintensives Polling erforderlich ist.
  • Konstante hohe Frequenz verhindern: Schreibe Code, der die CPU nicht dazu zwingt, ständig mit der höchsten Frequenz zu arbeiten. Um den Energieverbrauch zu minimieren, sollten inaktive Systeme in den Energiesparmodus oder Ruhemodus wechseln können.
  • Asynchrone Verarbeitung verwenden: Verwenden Sie die asynchrone Verarbeitung, um zu verhindern, dass Threads während der Wartezeiten gesperrt werden. Dieser Ansatz setzt Ressourcen frei und führt zu einer höheren Gesamtauslastung der Ressourcen.

Speicher- und Laufwerks-E/A effizient verwalten

Eine ineffiziente Speicher- und Laufwerksnutzung führt zu unnötiger Verarbeitung und erhöhtem Stromverbrauch. Verwenden Sie die folgenden Techniken, um Arbeitsspeicher und E/A effizient zu verwalten:

  • Strikte Speicherverwaltung: Ergreifen Sie Maßnahmen, um nicht verwendete Speicherressourcen proaktiv freizugeben. Vermeiden Sie es, große Objekte länger als nötig im Arbeitsspeicher zu halten. Dieser Ansatz verhindert Leistungsengpässe und reduziert den Stromverbrauch für den Speicherzugriff.
  • Laufwerk-E/A optimieren: Reduzieren Sie die Häufigkeit der Lese- und Schreibinteraktionen Ihrer Anwendung mit nichtflüchtigen Speicherressourcen. Verwenden Sie beispielsweise einen Zwischenspeicher, um Daten zu speichern. Schreiben Sie die Daten in festen Intervallen oder wenn der Zwischenspeicher eine bestimmte Größe erreicht, in den nichtflüchtigen Speicher.
  • Batchvorgänge: Fassen Sie häufige, kleine Laufwerkvorgänge in weniger, größeren Batchvorgängen zusammen. Ein Batchvorgang verbraucht weniger Energie als viele einzelne, kleine Transaktionen.
  • Komprimierung verwenden: Reduzieren Sie die Datenmenge, die auf Laufwerke geschrieben oder von ihnen gelesen wird, indem Sie geeignete Datenkomprimierungstechniken anwenden. Wenn Sie beispielsweise Daten komprimieren möchten, die Sie in Cloud Storage speichern, können Sie die dekomprimierende Transcodierung verwenden.

Netzwerkverkehr minimieren

Netzwerkressourcen verbrauchen bei Datenübertragungen erhebliche Energie. Verwenden Sie die folgenden Techniken, um die Netzwerkkommunikation zu optimieren:

  • Nutzlastgröße minimieren: Entwerfen Sie Ihre APIs und Anwendungen so, dass nur die Daten übertragen werden, die für eine Anfrage erforderlich sind. Vermeiden Sie das Abrufen oder Zurückgeben großer JSON- oder XML-Strukturen, wenn nur wenige Felder erforderlich sind. Achten Sie darauf, dass die zurückgegebenen Datenstrukturen prägnant sind.
  • Roundtrips reduzieren: Verwenden Sie intelligentere Protokolle, um die Anzahl der Netzwerk-Roundtrips zu reduzieren, die für eine Nutzeraktion erforderlich sind. Bevorzugen Sie beispielsweise HTTP/3 gegenüber HTTP/1.1, wählen Sie GraphQL gegenüber REST, verwenden Sie binäre Protokolle und konsolidieren Sie API-Aufrufe. Wenn Sie die Anzahl der Netzwerkaufrufe reduzieren, senken Sie den Energieverbrauch sowohl für Ihre Server als auch für die Endnutzergeräte.

Frontend-Optimierung implementieren

Durch die Frontend-Optimierung werden die Daten minimiert, die Ihre Endnutzer herunterladen und verarbeiten müssen. Dadurch wird die Belastung der Ressourcen von Endnutzergeräten reduziert.

Code und Assets minimieren

Wenn Endnutzer kleinere und effizienter strukturierte Ressourcen herunterladen und verarbeiten müssen, verbrauchen ihre Geräte weniger Strom. Mit den folgenden Techniken können Sie das Downloadvolumen und die Verarbeitungslast auf Endnutzergeräten minimieren:

  • Minimierung und Komprimierung: Entfernt bei JavaScript-, CSS- und HTML-Dateien unnötige Zeichen wie Leerzeichen und Kommentare mit geeigneten Minimierungstools. Achten Sie darauf, dass Dateien wie Bilder komprimiert und optimiert sind. Sie können die Minimierung und Komprimierung von Web-Assets mithilfe einer CI/CD-Pipeline automatisieren.
  • Lazy Loading: Bilder, Videos und nicht kritische Assets werden nur geladen, wenn sie tatsächlich benötigt werden, z. B. wenn diese Elemente in den Darstellungsbereich einer Webseite gescrollt werden. Dadurch wird das Volumen der anfänglichen Datenübertragung und die Verarbeitungslast auf den Endnutzergeräten reduziert.
  • Kleinere JavaScript-Bundles: Entfernen Sie nicht verwendeten Code aus Ihren JavaScript-Bundles, indem Sie moderne Modul-Bundler und Techniken wie Tree-Shaking verwenden. Dieser Ansatz führt zu kleineren Dateien, die schneller geladen werden und weniger Serverressourcen verbrauchen.
  • Browser-Caching: Verwenden Sie HTTP-Caching-Header, um den Browser des Nutzers anzuweisen, statische Assets lokal zu speichern. Das Browser-Caching verhindert wiederholte Downloads und unnötigen Netzwerkverkehr bei nachfolgenden Besuchen.

Nutzerfreundlichkeit für passive Nutzer priorisieren

Das Design Ihrer Benutzeroberfläche kann erhebliche Auswirkungen auf die Rechenkomplexität beim Rendern von Frontend-Inhalten haben. Verwenden Sie die folgenden Techniken, um Frontend-Schnittstellen zu erstellen, die eine einfache UX bieten:

  • Effizientes Rendering: Vermeiden Sie ressourcenintensive, häufige Änderungen am Document Object Model (DOM). Schreiben Sie Code, der die Rendering-Komplexität minimiert und unnötiges erneutes Rendern vermeidet.
  • Leichte Designmuster: Verwenden Sie nach Möglichkeit statische Websites oder Progressive Web-Apps (PWAs). Solche Websites und Apps werden schneller geladen und erfordern weniger Serverressourcen.
  • Barrierefreiheit und Leistung: Responsive, schnell ladende Websites sind oft nachhaltiger und barrierefreier. Ein optimiertes, übersichtliches Design reduziert die Ressourcen, die beim Rendern von Inhalten verbraucht werden. Websites, die für Leistung und Geschwindigkeit optimiert sind, können zu höheren Umsätzen beitragen. Laut der Studie Milliseconds Make Millions von Deloitte und Google führt eine Verbesserung der Websitegeschwindigkeit um 0,1 Sekunden (100 ms) zu einer Steigerung der Conversions auf Einzelhandelswebsites um 8,4 % und zu einer Steigerung des durchschnittlichen Bestellwerts um 9,2 %.