Sviluppare software a risparmio energetico

Last reviewed 2026-01-28 UTC

Questo principio del pilastro della sostenibilità del Google Cloud Well-Architected Framework fornisce consigli per scrivere software che riduca al minimo il consumo energetico e il carico del server.

Panoramica del principio

Quando segui le best practice per creare le tue applicazioni cloud, ottimizzi l'energia utilizzata dalle risorse dell'infrastruttura cloud: AI, calcolo, spazio di archiviazione e rete. Contribuisci anche a ridurre il fabbisogno idrico dei data center e l'energia consumata dai dispositivi degli utenti finali quando accedono alle tue applicazioni.

Per creare software a basso consumo energetico, devi integrare le considerazioni sulla sostenibilità durante l'intero ciclo di vita del software, dalla progettazione e dallo sviluppo al deployment, alla manutenzione e all'archiviazione. Per indicazioni dettagliate sull'utilizzo dell'AI per creare software che riduca al minimo l'impatto ambientale dei carichi di lavoro cloud, consulta l' Google Cloud e-book, Crea software in modo sostenibile.

Consigli

I consigli in questa sezione sono raggruppati nelle seguenti aree di interesse:

Riduci al minimo il lavoro computazionale

Per scrivere software a basso consumo energetico, devi ridurre al minimo la quantità totale di lavoro computazionale eseguito dalla tua applicazione. Ogni istruzione non necessaria, loop ridondante e funzionalità aggiuntiva consuma energia, tempo e risorse. Utilizza i seguenti consigli per creare software che esegua calcoli minimi.

Scrivi codice snello e mirato

Per scrivere codice minimo essenziale per ottenere i risultati richiesti, utilizza i seguenti approcci:

  • Elimina la logica ridondante e le funzionalità non necessarie: scrivi codice che esegua solo le funzioni essenziali. Evita le funzionalità che aumentano l'overhead computazionale e la complessità, ma non forniscono un valore misurabile per i tuoi utenti.
  • Esegui il refactoring: per migliorare l'efficienza energetica nel tempo, esegui regolarmente un audit delle tue applicazioni per identificare le funzionalità inutilizzate. Intervieni per rimuovere o eseguire il refactoring di queste funzionalità, a seconda dei casi.
  • Evita operazioni non necessarie: non calcolare un valore o eseguire un'azione finché il risultato non è necessario. Utilizza tecniche come la valutazione lazy, che ritardano i calcoli finché un componente dipendente dell'applicazione non ha bisogno dell'output.
  • Dai la priorità alla leggibilità e alla riusabilità del codice: scrivi codice leggibile e riutilizzabile. Questo approccio riduce al minimo la duplicazione e segue il principio "non ripetere te stesso" (DRY), che può contribuire a ridurre le emissioni di anidride carbonica derivanti dallo sviluppo e dalla manutenzione del software.

Utilizza la memorizzazione nella cache del backend

La memorizzazione nella cache del backend garantisce che un'applicazione non esegua ripetutamente lo stesso lavoro. Un elevato rapporto di hit della cache comporta una riduzione quasi lineare del consumo energetico per richiesta. Per implementare la memorizzazione nella cache del backend, utilizza le seguenti tecniche:

  • Memorizza nella cache i dati frequenti: archivia i dati a cui si accede di frequente in una posizione di archiviazione temporanea, ad alte prestazioni. Ad esempio, utilizza un servizio di memorizzazione nella cache in memoria come Memorystore. Quando un'applicazione recupera i dati da una cache, il volume di query di database e operazioni di I/O del disco viene ridotto. Di conseguenza, il carico sui database e sui server nel backend diminuisce.
  • Memorizza nella cache le risposte API: per evitare chiamate di rete ridondanti e costose, memorizza nella cache i risultati delle richieste API frequenti.
  • Dai la priorità alla memorizzazione nella cache in memoria: per eliminare le operazioni di I/O del disco lente e le query di database complesse, archivia i dati nella memoria ad alta velocità (RAM).
  • Seleziona strategie di scrittura della cache appropriate:
    • La strategia di scrittura diretta garantisce che i dati vengano scritti in modo sincrono nella cache e nell'archivio permanente. Questa strategia aumenta la probabilità di hit della cache, quindi l'archivio permanente riceve meno richieste di lettura a elevato consumo energetico.
    • La strategia di scrittura differita (write-behind) migliora il rendimento delle applicazioni con un elevato numero di scritture. I dati vengono scritti prima nella cache e il database viene aggiornato in modo asincrono in un secondo momento. Questa strategia riduce il carico di scrittura immediato sui database più lenti.
  • Utilizza policy di eliminazione intelligenti: mantieni la cache snella ed efficiente. Per rimuovere i dati obsoleti o di scarsa utilità e massimizzare lo spazio disponibile per i dati richiesti di frequente, utilizza policy come la durata (TTL), l'algoritmo LRU (Least Recently Used) e l'algoritmo LFU (Least Frequently Used).

Utilizza algoritmi e strutture di dati efficienti

Gli algoritmi e le strutture di dati che scegli determinano la complessità computazionale non elaborata del tuo software. Quando selezioni algoritmi e strutture di dati appropriati, riduci al minimo il numero di cicli della CPU e le operazioni di memoria necessarie per completare un'attività. Un minor numero di cicli della CPU e operazioni di memoria comporta un minor consumo energetico.

Scegli algoritmi per una complessità temporale ottimale

Dai la priorità agli algoritmi che raggiungono il risultato richiesto nel minor tempo possibile. Questo approccio contribuisce a ridurre la durata dell'utilizzo delle risorse. Per selezionare gli algoritmi che ottimizzano l'utilizzo delle risorse, utilizza i seguenti approcci:

  • Concentrati sulla riduzione della complessità: per valutare la complessità, vai oltre le metriche di runtime e considera la complessità teorica dell'algoritmo. Ad esempio, rispetto all' ordinamento a bolle, ordinamento per fusione riduce significativamente il carico computazionale e il consumo energetico per i set di dati di grandi dimensioni.
  • Evita il lavoro ridondante: utilizza le funzioni integrate e ottimizzate nel linguaggio di programmazione o nel framework scelto. Queste funzioni vengono spesso implementate in un linguaggio di livello inferiore e più efficiente dal punto di vista energetico, come C o C++, quindi sono ottimizzate meglio per l'hardware sottostante rispetto alle funzioni con codice personalizzato.

Seleziona strutture di dati per l'efficienza

Le strutture di dati che scegli determinano la velocità con cui i dati possono essere recuperati, inseriti o elaborati. Questa velocità influisce sull'utilizzo della CPU e sulla memoria utilizzata. Per selezionare strutture di dati efficienti, utilizza i seguenti approcci:

  • Ottimizza per la ricerca e il recupero: per le operazioni comuni come verificare se un elemento esiste o recuperare un valore specifico, preferisci le strutture di dati ottimizzate per la velocità. Ad esempio, le mappe hash o i set hash consentono ricerche in tempo quasi costante, un approccio più efficiente dal punto di vista energetico rispetto alla ricerca lineare in un array.
  • Riduci al minimo il footprint della memoria: le strutture di dati efficienti contribuiscono a ridurre il footprint complessivo della memoria di un'applicazione. La riduzione dell'accesso e della gestione della memoria comporta un minor consumo energetico. Inoltre, un profilo di memoria più snello consente ai processi di essere eseguiti in modo più efficiente, il che ti consente di posticipare gli upgrade delle risorse.
  • Utilizza strutture specializzate: utilizza strutture di dati create appositamente per un determinato problema. Ad esempio, utilizza una trie struttura di dati per la ricerca rapida di prefissi di stringhe e utilizza una coda di priorità quando devi accedere in modo efficiente solo al valore più alto o più basso.

Ottimizza le operazioni di calcolo e sui dati

Quando sviluppi software, concentrati sull'utilizzo efficiente e proporzionale delle risorse in tutto lo stack tecnologico. Considera CPU, memoria, disco e rete come risorse limitate e condivise. Tieni presente che l'utilizzo efficiente delle risorse comporta riduzioni tangibili dei costi e del consumo energetico.

Ottimizza l'utilizzo della CPU e il tempo di inattività

Per ridurre al minimo il tempo in cui la CPU trascorre in uno stato attivo a elevato consumo energetico senza eseguire un lavoro significativo, utilizza i seguenti approcci:

  • Preferisci la logica basata su eventi al polling: sostituisci i loop occupati a elevato consumo di risorse o il controllo costante (polling) con la logica basata su eventi. Un'architettura basata su eventi garantisce che i componenti di un'applicazione funzionino solo quando vengono attivati da eventi pertinenti. Questo approccio consente l'elaborazione on demand, eliminando la necessità di un polling a elevato consumo di risorse.
  • Evita la frequenza elevata costante: scrivi codice che non costringa la CPU a operare costantemente alla massima frequenza. Per ridurre al minimo il consumo energetico, i sistemi inattivi devono essere in grado di entrare in stati di basso consumo o in modalità di sospensione.
  • Utilizza l'elaborazione asincrona: per evitare che i thread vengano bloccati durante i tempi di attesa inattivi, utilizza l'elaborazione asincrona. Questo approccio libera le risorse e comporta un utilizzo complessivo delle risorse più elevato.

Gestisci in modo efficiente la memoria e l'I/O del disco

L'utilizzo inefficiente della memoria e del disco comporta un'elaborazione non necessaria e un aumento del consumo energetico. Per gestire la memoria e l'I/O in modo efficiente, utilizza le seguenti tecniche:

  • Gestione rigorosa della memoria: Passa all'azione per rilasciare in modo proattivo le risorse di memoria inutilizzate. Evita di conservare oggetti di grandi dimensioni in memoria per periodi di tempo più lunghi del necessario. Questo approccio impedisce i colli di bottiglia delle prestazioni e riduce la potenza consumata per l'accesso alla memoria.
  • Ottimizza l'I/O del disco: riduci la frequenza delle interazioni di lettura e scrittura della tua applicazione con le risorse di archiviazione permanente. Ad esempio, utilizza un buffer di memoria intermedio per archiviare i dati. Scrivi i dati nell'archiviazione permanente a intervalli fissi o quando il buffer raggiunge una determinata dimensione.
  • Operazioni batch: consolida le operazioni su disco frequenti e di piccole dimensioni in operazioni batch più grandi e meno numerose. Un'operazione batch consuma meno energia rispetto a molte singole transazioni di piccole dimensioni.
  • Utilizza la compressione: riduci la quantità di dati scritti o letti dai dischi applicando tecniche di compressione dei dati appropriate. Ad esempio, per comprimere i dati archiviati in Cloud Storage, puoi utilizzare la transcodifica decompressiva.

Riduci al minimo il traffico di rete

Le risorse di rete consumano una quantità significativa di energia durante le operazioni di trasferimento dei dati. Per ottimizzare la comunicazione di rete, utilizza le seguenti tecniche:

  • Riduci al minimo le dimensioni del payload: progetta le tue API e applicazioni in modo da trasferire solo i dati necessari per una richiesta. Evita di recuperare o restituire strutture JSON o XML di grandi dimensioni nei casi in cui sono necessari solo alcuni campi. Assicurati che le strutture di dati restituite siano concise.
  • Riduci i round trip: per ridurre il numero di round trip di rete necessari per completare un'azione utente, utilizza protocolli più intelligenti. Ad esempio, preferisci HTTP/3 a HTTP/1.1, scegli GraphQL rispetto a REST, utilizza protocolli binari e consolida le chiamate API. Quando riduci il volume delle chiamate di rete, riduci il consumo energetico sia per i server sia per i dispositivi degli utenti finali.

Implementa l'ottimizzazione del frontend

L'ottimizzazione del frontend riduce al minimo i dati che gli utenti finali devono scaricare ed elaborare, contribuendo a ridurre il carico sulle risorse dei dispositivi degli utenti finali.

Riduci al minimo il codice e gli asset

Quando gli utenti finali devono scaricare ed elaborare risorse più piccole e strutturate in modo più efficiente, i loro dispositivi consumano meno energia. Per ridurre al minimo il volume di download e il carico di elaborazione sui dispositivi degli utenti finali, utilizza le seguenti tecniche:

  • Riduzione e compressione: per i file JavaScript, CSS e HTML, rimuovi i caratteri non necessari come spazi vuoti e commenti utilizzando gli strumenti di riduzione appropriati. Assicurati che i file come le immagini siano compressi e ottimizzati. Puoi automatizzare la riduzione e la compressione degli asset web utilizzando una pipeline CI/CD.
  • Caricamento lento: carica immagini, video e asset non critici solo quando sono effettivamente necessari, ad esempio quando questi elementi scorrono nel riquadro visibile di una pagina web. Questo approccio riduce il volume di trasferimento iniziale dei dati e il carico di elaborazione sui dispositivi degli utenti finali.
  • Bundle JavaScript più piccoli: elimina il codice inutilizzato dai bundle JavaScript utilizzando i bundler di moduli moderni e tecniche come tree shaking. Questo approccio genera file più piccoli che vengono caricati più velocemente e utilizzano meno risorse del server.
  • Memorizzazione nella cache del browser: utilizza le intestazioni di memorizzazione nella cache HTTP per indicare al browser dell'utente di archiviare gli asset statici localmente. La memorizzazione nella cache del browser contribuisce a evitare download ripetuti e traffico di rete non necessario nelle visite successive.

Dai la priorità a un'esperienza utente semplice e leggera (UX)

La progettazione dell'interfaccia utente può avere un impatto significativo sulla complessità computazionale per il rendering dei contenuti del frontend. Per creare interfacce frontend che forniscano un'esperienza utente leggera, utilizza le seguenti tecniche:

  • Rendering efficiente: evita la manipolazione frequente e a elevato consumo di risorse del DOM (Document Object Model). Scrivi codice che riduca al minimo la complessità del rendering ed elimini il rendering non necessario.
  • Pattern di progettazione leggeri: se appropriato, preferisci i siti statici o le app web progressive (PWA). Questi siti e app vengono caricati più velocemente e richiedono meno risorse del server.
  • Accessibilità e prestazioni: i siti adattabili e a caricamento rapido sono spesso più sostenibili e accessibili. Un design ottimizzato e senza elementi superflui riduce le risorse consumate durante il rendering dei contenuti. I siti web ottimizzati per il rendimento e la velocità possono contribuire a generare entrate più elevate. Secondo uno studio di ricerca di Deloitte e Google, Milliseconds Make Millions, un miglioramento di 0,1 secondi (100 ms) nella velocità del sito comporta un aumento dell'8,4% delle conversioni per i siti di vendita al dettaglio e un aumento del 9,2% del valore medio degli ordini.