Ottimizzazione del codice

In un precedente articolo ho affrontato la problematica della mancanza di ottimizzazione del codice… vediamone un semplicissimo esempio…

In riferimento ad un recente articolo nel quale vi esponevo le problematiche della programmazione non ottimizzata e come questa rende, in qualche modo, vano il progresso fatto dall’hardware, vi propongo un semplice esempio sotto forma di quiz.

Prendiamo ad esempio le due porzioni di codice

Come possiamo notare sono due porzioni di codice che, nonostante la palese diversità, svolgono la medesima funzione. Questo esempio ci permette anche di dimostrare che il medesimo scopo si può raggiungere, come ho sempre detto, in mille modi diversi.

Entrambi i programmi effettuano 10 volte le due righe di codice:

sum += analogRead(A0);
campioni++;

ossia una lettura analogica che viene inserita in una variabile utilizzata per calcolare la media ed incrementa una variabile denominata campioni, utilizzata in seguito per ricavare la media in questione.

Le 3 domande che vi pongo sono le seguenti:

  • Quale dei due codici è più efficiente, ossia richiede meno tempo per essere eseguito;
  • Quale dei due richiede meno spazio una volta compilato;
  • Di quanto un codice è più efficiente dell’altro?

Benché potrà sembrare sorprendente, il codice più efficiente è il B, nonostante, scritto in C, richieda apparentemente più istruzioni. Per capire il perché, è fondamentale conoscere il funzionamento di un microprocessore o microcontrollore. La cosa più importante da tenere a mente è che un processore non sa controllare in maniera diretta se un numero è uguale, maggiore o inferiore ad un altro, ma sa solo se un numero è uguale a zero.

Quindi, un processore, per sapere se un numero è uguale a 10 deve:

  • caricare in un suo registro, detto accumulatore, il valore della variabile da controllare
  • sottrarre a quel registro il valore 10;
  • verificare nel registro di status se il risultato è zero;

Per questo motivo, effettuare un ciclo FOR (codice A) controllando che la variabile X sia minore di 10 implica, per il compilatore, scrivere, in assembler (linguaggio interpretabile dal processore), un sorgente molto più elaborato e complicato.

Nel caso B, invece, il codice prevede il check della variabile X uguale a zero, che per la CPU è immediato. Inoltre il ciclo While(1) non è che un loop che richiede una sola istruzione. Per questi motivi il codice B è molto più efficiente anche se ad una prima occhiata sembra più lungo.

Per lo stesso motivo il codice B occupa è anche molto meno spazio, una volta compilato, poiché la lunghezza del codice è direttamente proporzionale alla sua velocità di esecuzione.

In merito, infine, alla valutazione sulle performance, il codice B è più efficiente del 15% circa. Infatti, in un periodo di 200 ms, il codice A ha totalizzato l’esecuzione di circa 170 cicli del codice in oggetto mentre il codice B ben 200.

I test sono stati effettuali su un “arduino Uno” ed allego, qui di seguito, il codice per effettuare voi stessi la prova.

La scheda Arduino utilizzata per la prova

Anche se tecnico, spero che l’articolo vi abbia aiutato a comprendere quanto importante è l’ottimizzazione del codice e soprattutto quanto importante è conoscere l’hardware sul quale si programma. Sostengo da anni che ogni buon programmatore dovrebbe iniziare con dei semplici microcontrollori per imparare a scrivere codice veramente ottimizzato in quanto su questi dispositivi le risorse a disposizione sono estremamente limitate.

Visite totali: 334
Visite Oggi: 2
Letture: 14614

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Next Post

Windows 10 migliora il Bluetooth

Gio Mag 21 , 2020
Finalmente un gradito ritorno su Windows 10... Il bluetooth anche in ingresso...

Ti potrebbe interessare...