Corso C su Raspberry PI partendo da zero: Ottimizzazione

Con il termine ottimizzazione ci riferiamo a tutte le tecniche di miglioramento di un programma, sotto diversi aspetti: ottimizzazione del codice, di velocità, di spazio occupato in memoria, eccetera. L'articolo tratta, in maniera semplice ed esaustiva, dei metodi per rendere il proprio programma più performante ed affidabile, secondo le diverse esigenze del programmatore e, soprattutto, dell'utente che lo deve utilizzare.

Introduzione

Un programma, come abbiamo anche visto nelle puntate precedenti, può essere scritto ed organizzato in tantissimi modi diversi. Non esiste una soluzione migliore in assoluto ma ci sono, sicuramente, dei casi in cui il software risulta funzionante, ma non funzionale. Esistono, inoltre, casi in cui esso riesce a portare avanti il compito per cui è stato scritto ma il modo con cui lo fa risulta essere goffo e impreciso. Parlare di ottimizzazione richiederebbe migliaia di pagine; noi trattiamo i casi fondamentali è più abbordabili da parte dei principianti e dei lettori che hanno intrapreso la lettura del presente corso. Iniziamo, per rompere il ghiaccio, ad esaminare il seguente codice. Esso ha lo scopo di mostrare a video l'area di un cerchio, dal raggio sempre più crescente (1, 2, 3, 4, 5, ecc.). Funziona perfettamente ma ha un "piccolo" difetto, che esamineremo dopo. Guardiamo il listato, eseguiamolo e dopo lo commentiamo.

#include <stdio.h>
int main(){
   int r;
   float p,area;
   for(r=1;r<=20;r++) {
      p=3.1415926;
      area=r*r*p;
      printf("La superficie di un cerchio con raggio %d equivale a %f  \n",r,area);
   }
   return 0;
}

La figura 1 mostra la schermata di esecuzione. Il tutto funziona egregiamente, ma c'è una piccola "ombra" che allontana il nostro algoritmo dall'essere perfetto. Riuscite a trovarla?

Figura 1: Esecuzione del programma del cerchio.

Ricordate questa preziosa regola: dobbiamo evitare di fare eseguire al PC compiti inutili e, soprattutto, il meno possibile. Quale è il difetto del listato? Guardate l'istruzione posta subito dopo il ciclo for: p=3.1415926. Essa assegna alla variabile "p", di tipo float, il valore del pi greco, usato per calcolare l'area. Tutto giusto, ma perché tale comando deve trovarsi all'interno del ciclo iterativo, ripetendosi (inutilmente) per 20 volte? Ne basterebbe una sola, inserita prima dell'inizio del ciclo stesso.

Se vogliamo fare un paragone, è un po' come se un bimbo si mettesse su una classica giostra con i cavalli e suo papà pagasse il biglietto (o frazione di esso) ad ogni giro: tutto lavoro inutile e dispendioso. Basta pagare solo all'inizio, prima che la giostra cominci a girare. Pertanto, per correggere il sorgente, dovete "spostare" la linea di codice incriminata subito prima dell'inizio del ciclo, come mostrato nel listato qui sotto. Il programma funziona nella medesima modalità ma il processore lavora un po' meno e, soprattutto, esegue meno compiti. State tranquilli che il PC ha tanta memoria e se gli insegniamo qualcosa "una volta sola", lo ricorda per sempre. Il calcolo dell'area deve essere, invece, eseguito, dentro il ciclo iterativo, perché la misura del raggio varia sempre. Molte volte queste tipologie di errori, o meglio di imperfezioni, non vengono trovate facilmente poiché tutto funziona a dovere, non ci sono blocchi e il programmatore non immagina, nemmeno lontanamente, che il "bug" è in agguato. Lo scopo dell'ottimizzazione è, dunque, quello di realizzare dei costrutti efficienti.

#include <stdio.h>
int main(){
   int r;
   float p,area;
   p=3.1415926;
   for(r=1;r<=20;r++) {
      area=r*r*p;
      printf("La superficie di un cerchio con raggio %d equivale a %f  \n",r,area);
   }
   return 0;
}

Risparmiamo spazio in Ram

Spesso il programmatore non sta molto attento all'effettivo consumo di RAM da parte delle variabili. Anticamente, quando la memoria era davvero limitata (e parliamo di PC con 128Kb di Ram), occorreva prevedere tanti stratagemmi per riuscire a farvi entrare il programma. Lo spazio libero era esiguo e si cercavano strategie, anche difficoltose, per [...]

ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2342 parole ed è riservato agli abbonati PLATINUM. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici PREMIUM e PLATINUM e potrai fare il download (PDF) di tutti gli EOS-Book, Firmware e degli speciali MONOTEMATICI. ABBONATI ORA con PAYPAL è semplice e sicuro.

Abbonati alle riviste di elettronica

4 Commenti

  1. Maurizio Di Paolo Emilio Maurizio 1 settembre 2016
  2. Giovanni Di Maria Giovanni Di Maria 5 settembre 2016
  3. enzocavallaro 2 ottobre 2016
  4. Giovanni Di Maria Giovanni Di Maria 2 ottobre 2016

Scrivi un commento

ESPertino è la nuova scheda per IoT compatibile ARDUINO.
Scopri come averla GRATIS!