
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?
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. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.

Sono sempre stato convinto che l’ottimizzazione è la parte più importante e difficile di un software. In particolare, il ciclo for con il suo fattore computazionale “gioca” un ruolo molto importante, in questa sede viene messo molto bene in evidenzia una possibile ottimizzazione che per una scheda embedded come la raspberry è decisamente un serio problema.
Un codice ben impostato e ottimizzzato eseguito su un lentissimo PC è molto più efficente di un codice approssimativo eseguito su supercomputer.
Buon giorno,
volevo chiedere un vostro parere. Ho il mio raspberry configurato dalla prima lezione e poi di volta in volta seguendo il corso.
Mi è successo che senza nessun evento in particolare da ieri mattina non si avvia più, alimentandolo resta in una fase di stallo senza arrivare mai ne all’ambiente grafico ne a quello in riga di comando. Secondo voi è recuperabile ed ancora più importante come evitare una cosa del genere se si usasse il raspberry per applicazioni vending?
Grazie anticipate per l’attenzione
Enzo
Ciao.
Controlla se la scheda SD è inserita bene, bastano pochi millimetri per non fare avvenire il contatto. Il Raspberry lavora a basse temperature, per cui escludo che la CPU si sia fusa. Controlla anche se il collegamento col monitor è OK. Il connettore RCA, in effetti è un po’ critico e delicato. Se usi HDMI invece non ci sono problemi.
Escludo sia un problema hardware, per cui, al limite, riformatta la SD e gli ricopy sopra il S;O. Raspian,
Saluti
Giovanni