Piccola guida per ottimizzare i nostri programmi C - Seconda parte
Eccoci arrivati alla seconda parte della guida, come promesso. Ecco altri piccoli suggerimenti che dovremmo cercare di seguire tutti:
Riduciamo al minimo possibile le iterazioni. Per quanto una parte di codice possa essere leggera, se la ripetiamo migliaia di volte avrà certamente il suo peso sulle prestazioni generali.
Combinare i cicli for assieme in ogni punto appropriato, per risparmiare sul numero di incrementi (di uno stesso indice) e su quante volte una condizione verrà verificata. Facciamo attenzione, però, questa operazione va fatta con cautela, o rischiamo di stravolgere il nostro algoritmo e renderlo malfunzionante.
Invertiamo i loop, se è possibile. Facciamo un esempio per rendere l’idea. Da questo codice…
for (i = 1; i <= MAX; i++)
{
...
}
…si passa a…
i = MAX+1;
while (--i)
{
...
}
Di nuovo, questa sorta di refactoring va fatto accortamente, perché è ancora più “rischioso”, come potete facilmente immaginare.
Sostituiamo le espressioni complesse, da un punto di vista computazionale, con altre meno complesse che danno il medesimo risultato. Qui si tratta di ottimizzazione a livello di istruzioni singole. Per capirci, facciamo alcuni esempi: una moltiplicazione del tipo x * x è meno dispendiosa di pow(x, 2.0); lo shift lo è meno rispetto alla moltiplicazione; l’addizione lo è meno della moltiplicazione. Se stiamo attenti, potremmo individuare parti delle nostre applicazioni dove potremmo ottenere i medesimi valori facendo calcoli meno pesanti e quindi più veloci.
Le strategie di ottimizzazione sono davvero innumerevoli, perciò ne illustrerò altre in articoli futuri dell’Inforum blog.



















Maurizio Lombardi said,
Wrote on Giugno 28, 2008 @ 9:21
Dove l’hai letta questa cosa di “invertire i loop”?
Perché non c’è alcuna differenza veramente
degna di nota nell’assembler generato.
(Prova tu stesso, fatti due file .c che implementano lo stesso ciclo nei due modi differenti e compilali con il gcc passando l’opzione -S)
Ma poi, supponiamo anche che con uno sporco trucco riesci a guadagnare 1
milionesimo di secondo, ma il codice diventa meno leggibile (devi leggere il ciclo… al contrario) e magari introduci un bug; ne vale veramente la pena?
System Crasher said,
Wrote on Giugno 28, 2008 @ 22:35
Ciao Maurizio!
Ecco la fonte di quell’informazione: http://www.prism.uvsq.fr/~cedb/local_copies/lee.html .
In realtà noto che mi sono espresso male: quell’indicazione è valida solo se il codice viene eseguito su macchine dotate di un’istruzione speciale per il decremento e per il confronto con 0.
Grazie per l’osservazione (mi sa che dovrò correggere l’articolo)!