Sviluppare software a risparmio energetico

Last reviewed 2026-10-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, computing, archiviazione e rete. Inoltre, contribuisci 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 risparmio energetico, devi integrare 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 workload cloud, consulta l'ebook Google Cloud Crea software in modo sostenibile.

Consigli

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

Riduci al minimo il lavoro di calcolo

Per scrivere software a risparmio energetico, devi ridurre al minimo la quantità totale di lavoro di calcolo 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 il codice minimo essenziale per ottenere i risultati richiesti, utilizza i seguenti approcci:

  • Elimina la logica ridondante e l'eccesso di funzionalità: scrivi codice che esegua solo le funzioni essenziali. Evita le funzionalità che aumentano l'overhead e la complessità di calcolo, ma non forniscono un valore misurabile agli utenti.
  • Rifattorizza: per migliorare l'efficienza energetica nel tempo, controlla regolarmente le tue applicazioni per identificare le funzionalità inutilizzate. Intervieni per rimuovere o rifattorizzare queste funzionalità, se necessario.
  • Evita operazioni non necessarie: non calcolare un valore o eseguire un'azione finché non è necessario il risultato. Utilizza tecniche come la valutazione lazy, che ritarda i calcoli finché un componente dipendente nell'applicazione non richiede l'output.
  • Dai priorità alla leggibilità e alla riusabilità del codice: scrivi codice leggibile e riutilizzabile. Questo approccio riduce al minimo la duplicazione e segue il principio DRY (Don't Repeat Yourself), 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 lo stesso lavoro ripetutamente. Una percentuale successi cache elevata porta a 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 accedi 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 delle query del database e delle operazioni di I/O su disco viene ridotto. Di conseguenza, il carico sui database e sui server nel backend diminuisce.
  • Memorizza nella cache le risposte dell'API: per evitare chiamate di rete ridondanti e costose, memorizza nella cache i risultati delle richieste API frequenti.
  • Dai la priorità alla memoria cache in memoria: per eliminare le operazioni di I/O su disco lente e le query di database complesse, archivia i dati nella memoria ad alta velocità (RAM).
  • Seleziona le strategie di scrittura nella cache appropriate:
    • La strategia write-through garantisce che i dati vengano scritti in modo sincrono nella cache e nell'archiviazione permanente. Questa strategia aumenta la probabilità di successi della cache, in modo che l'archiviazione permanente riceva meno richieste di lettura ad alto consumo energetico.
    • La strategia write-back (write-behind) migliora le prestazioni 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 rimozione intelligenti: mantieni la cache snella ed efficiente. Per rimuovere i dati inattivi o di scarsa utilità e massimizzare lo spazio disponibile per i dati richiesti di frequente, utilizza policy come la durata (TTL), l'utilizzo meno recente (LRU) e l'utilizzo meno frequente (LFU).

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. Selezionando algoritmi e strutture di dati appropriati, riduci al minimo il numero di cicli della CPU e di operazioni di memoria necessari per completare un'attività. Un minor numero di cicli della CPU e di operazioni di memoria comporta un consumo energetico inferiore.

Scegliere gli algoritmi per una complessità temporale ottimale

Dai la priorità agli algoritmi che ottengono il risultato richiesto nel minor tempo possibile. Questo approccio aiuta 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à, non limitarti alle metriche di runtime e considera la complessità teorica dell'algoritmo. Ad esempio, rispetto al bubble sort, il merge sort riduce significativamente il carico di calcolo e il consumo energetico per i set di dati di grandi dimensioni.
  • Evita il lavoro ridondante: utilizza funzioni integrate e ottimizzate nel linguaggio di programmazione o nel framework che hai scelto. Queste funzioni sono 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 operazioni comuni come verificare se un elemento esiste o recuperare un valore specifico, preferisci strutture di dati ottimizzate per la velocità. Ad esempio, le mappe hash o i set hash consentono ricerche in tempi quasi costanti, un approccio più efficiente dal punto di vista energetico rispetto alla ricerca lineare in un array.
  • Riduci al minimo il footprint della memoria: strutture di dati efficienti aiutano a ridurre il footprint della memoria complessivo di un'applicazione. La riduzione dell'accesso e della gestione della memoria comporta un consumo energetico inferiore. Inoltre, un profilo di memoria più snello consente ai processi di essere eseguiti in modo più efficiente, il che ti permette di posticipare gli upgrade delle risorse.
  • Utilizza strutture specializzate: utilizza strutture di dati create appositamente per un determinato problema. Ad esempio, utilizza una struttura di dati trie per la ricerca rapida dei prefissi delle stringhe e 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 nell'intero stack tecnologico. Tratta CPU, memoria, disco e rete come risorse limitate e condivise. Riconoscere che l'utilizzo efficiente delle risorse porta a riduzioni tangibili dei costi e del consumo energetico.

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

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

  • Preferisci la logica basata sugli eventi al polling: sostituisci i loop occupati che richiedono molte risorse o il controllo costante (polling) con la logica basata sugli 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 che richiede un uso intensivo delle risorse.
  • Evita una frequenza costantemente elevata: scrivi codice che non costringa la CPU a funzionare costantemente alla frequenza massima. Per ridurre al minimo il consumo energetico, i sistemi inattivi devono essere in grado di entrare in stati di basso consumo o 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 risorse e porta a un utilizzo complessivo più elevato delle risorse.

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

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: intervieni per liberare in modo proattivo le risorse di memoria inutilizzate. Evita di conservare oggetti di grandi dimensioni in memoria per periodi più lunghi del necessario. Questo approccio evita colli di bottiglia nelle prestazioni e riduce l'energia 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 un numero inferiore di operazioni batch più grandi. Un'operazione batch consuma meno energia rispetto a molte piccole transazioni individuali.
  • Utilizza la compressione: riduci la quantità di dati scritti o letti dai dischi applicando tecniche di compressione dei dati adeguate. Ad esempio, per comprimere i dati archiviati in Cloud Storage, puoi utilizzare la transcodifica di decompressione.

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 API e le 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 richiesti 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 dell'utente, utilizza protocolli più intelligenti. Ad esempio, preferisci HTTP/3 a HTTP/1.1, scegli GraphQL anziché REST, utilizza protocolli binari e consolida le chiamate API. Quando riduci il volume delle chiamate di rete, riduci il consumo energetico sia per i tuoi 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.

Minimizza 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:

  • Minimizzazione e compressione: per i file JavaScript, CSS e HTML, rimuovi i caratteri non necessari come spazi vuoti e commenti utilizzando strumenti di minimizzazione appropriati. Assicurati che i file, come le immagini, siano compressi e ottimizzati. Puoi automatizzare la minimizzazione 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 nell'area visibile di una pagina web. Questo approccio riduce il volume del trasferimento di dati iniziale e il carico di elaborazione sui dispositivi degli utenti finali.
  • Bundle JavaScript più piccoli: elimina il codice inutilizzato dai bundle JavaScript utilizzando bundle di moduli moderni e tecniche come il tree shaking. Questo approccio consente di ottenere file più piccoli che si caricano 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 aiuta a evitare download ripetuti e traffico di rete non necessario nelle visite successive.

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

Il design della tua interfaccia utente può avere un impatto significativo sulla complessità computazionale per il rendering dei contenuti del frontend. Per creare interfacce frontend che offrono un'esperienza utente leggera, utilizza le seguenti tecniche:

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