Newsgroup: it.comp.lang.c
Titolo: Ottimizzazione del codice C

Salve a tutti,
mi trovo a dover ottimizzare un programma di elaborazione dati scritto in C
da terzi.....
al di là dell'eliminazione degli errori di programmazione e di
strutturazione del codice e delle ripetizioni più grossolane mi chiedevo se
qualcuno sa dove reperire un po' di risorse sull'argomento ottimizzazione in
generale e su qualche tecnica di ottimizzazione da seguire....
sarebbe interessante cioè avere una sorta di prospetto delle operazioni più
"costose" da eseguire al fine di cercare al massimo di evitarle e di alcuni
trucchi o consigli da seguire (sto parlando di trucchi del tipo eseguire le
divisioni tramite lo shift o cose del genere).....
naturalmente vorrei sapere se ha senso avere questo genere di accorgimenti
per produrre un codice "ottimizzato" con i compilatori di oggi (tipo quello
della MS in Visual Studio 6.0)
Grazie
Bye
John

 della MS in Visual Studio 6.0)
Secondo me dipende molto dal tipo di elaborazione che devi fare.
E dalla qualita' del software che hai tra le mani.
Ti faccio un esempio scemo.
Metti che ti passino una funzione nella quale
un tipo ordina un milione di record usando il
bubblesort (che effettua in media un numero di
operazioni proporzionali a n*n dove n e' il numero dei
record).
Puoi farci sopra tutte le ottimizzazioni che vuoi,
ma rimarra' sempre un algoritmo sbagliato
al posto sbagliato (visto che esistono
algoritmi di sorting piu' sofisticati
che effettuano un numero
di operazioni proporzionali a n*log(n) )
Nel tuo caso prima di tutto imparerei ad
usare un profiler, in modo da capire
quali frammenti del codice utilizzano di piu'
la CPU e poi mi dedicherei ad ottimizzare
quelli.
Tieni conto che la maggior parte delle ottimizzazioni
che ti possono venire in mente (a parte il cambiare
proprio l'algoritmo usato) e anche buona parte
di quelle che non ti possono venire in mente,
sono gia' fornite dai moderni compilatori.
Cioe' e' probabile che se tu scrivi y=8*x;
il compilatore capisca gia' da solo che puo'
usare uno shift e valuti quale strada gli
conviene di piu'.
Quindi o vai proprio a bassissimo livello
(cioe' usi l'assember, e devi saperlo usare bene
per "battere" il compilatore)
oppure ridisegni il codice ad alto livello.
In generale, secondo me ottimizzando singole
linee di codice non vai molto in la'.
Una cosa che puoi considerare e' l'uso della
memoria. Per ottimizzare l'uso della cache
puoi, ad esempio, riscrivere l'accesso ad
una struttura dati in modo che in tempi
successivi si acceda a record vicini, e non
saltando da una parte all'altra. Questa e'
una cosa che non penso un compilatore possa fare,
ma in particolari elaborazioni dati (operazioni
su grandi matrici, ad esempio) puo' avere un
notevole impatto sulle prestazioni.
ciao,
g.
-- 
AIUTARE= Accrescere il numero degli ingrati
(Ambrose Bierce, Il Dizionario del Diavolo)


Ne avevo il sospetto.
Ok, quindi vedrò di concentrarmi su un'ottimizzazione ad alto livello.
Bye
John

 Qualche nome e/o link per un profiler?
no, mi dispiace. L'ultima volta che ho usato un profiler
e' stato su un Cray T3D e il programma era in fortran.
Comunque presumo che ci sia, magari nello stesso pacchetto
del compilatore che usi.


 Qualche nome e/o link per un profiler?
Conosco solo gprof, dalla suite gcc, ma google immagino ti aiutera'.
-- 
Mat/tia Belletti - Undergraduate student @ 
cs.unibo.it
ICQ: 33292311    - email: 
mbel...@cs.unibo.it
IRC: RedGlow     - site(s): 
http://mbellett.web.cs.unibo.it/
Jabber: RedGlow  - Linux registered user 299762 @ machine 213003

 Conosco solo gprof, dalla suite gcc, ma google immagino ti aiutera'.
..., e solo per linux o anche per windows?
Ciao

 g.
[curioso]
..., e cosa ci facevi sun un CrayT3D
ps:avevi letto qualche cosa su questo supercomp!
quanti cpu hą?quanti Mflops eroga?
Ciao

 Ciao
Il calcolatore era al CINECA.
Ci parallelizzavo un codice fortran sequenzial/vettoriale
per la soluzione di alcuni problemi di fluidodinamica (roba Enel).
Mi sembra che avesse 128 processori (degli Alpha ?), ma
e' passato troppo tempo e non ricordo bene.
Fu poi sostituito da un Cray T3E. Non so se e' ancora in uso.
ciao,
g.


Facevi prima a guardarci da solo mi sa, cmq: per entrambe (se lo cerchi 
per windows, dai un'occhiata a cygwin e/o mingw32 per un porting)


 
Io uso Intel VTune, suggerisce quali sono i colli di bottiglia e quali 
le possibili soluzioni. Arriva perfino a dirti quante volte è passato su 
una certa zona del codice (all'interno delle funzioni).
Ma lo uso da poco e non ho avuto molto tempo per approfondirlo.
arry