Newsgroup: it.comp.lang.c
Titolo: Sulla velocita' di esecuzione

Salve, sto scrivendo un programma in c che esegue un elevato numero di
calcoli. Vorrei domandare al NG qualche consiglio per velocizzare
l'esecuzione di un programma.
Ad esempio: 
- e' vantagioso gestire i numeri interi (ove possibile) con il tipo
'char' anziche' 'int'?
- dividere un programma in varie sottoprocedure, aumenta i tempi di
esecuzione?
- quali sono le tipiche inefficienze da evitare in un programma C?
Nota: nel mio programma c'erano delle funzioni che ricevono, come
parametro, dei grossi record passati per valore. Ho provato a fargleli
passare per nome, immaginando che il programma divenisse piu' veloce, ed
invece e' avvenuto il contrario. Qualcuno sa ipotizzare una spiegazione?
Grazie,
-Fuz

invece e' avvenuto il contrario. Qualcuno sa ipotizzare una spiegazione?
Hmm. Prova a postare il codice.
Se vuoi un consiglio d'amico sulla velocità d'esecuzione, non te ne
preoccupare. E' meglio un programma lento di un programma che non funziona,
quindi scrivendo il codice cerca di fare le cose ordinate e per bene, senza
preoccuparti se il tutto sarà efficiente al massimo. Una volta che tutto
funziona c'è sempre tempo per incasinarsi ed ottimizzare :-)
Ah, altra cosa: ottimizza solo quello che serve davvero. Prova a procurarti
un profiler (gprof sotto linux): è uno strumento che ti dice quante volte
viene chiamata una funzione e quanto tempo ci si spende dentro.
Di solito le funzioni critiche per un programma sono solo 2 o 3 - le altre,
anche se scritte in maniera inefficiente, non influiscono quasi per nulla
sulla velocità di esecuzione. Trova quelle 2 o 3 funzioni e lavoraci sopra,
lascia perdere il resto.
Lanugo

 programmazione, comunque. 
Bisogna tenere anche in conto che un codice piccolo ( ovvero un codice dove 
le operazioni comuni sono raccolte in funzioni ) e' piu' facile che rientri 
tutto in cache.

 invece e' avvenuto il contrario. Qualcuno sa ipotizzare una spiegazione?
Intendi dire per riferimento (cioè con puntatore) vero?
Dipende tutto da quante volte viene eseguita una determinata funzione.
Se una funzione viene chiamata 100/1000 volte probabilmente i tempi di
esecuzione non
cambiano molto. Per ordini di grandezza superiori o per dati davvero grandi
passati per valore
probabilmente conviene passare i dati per riferimento o decidere di mettere
il codice inline.
Prima si usava anche effettuare le moltiplicazioni e divisioni tramite gli
operatori di shift << e >>
(es. 16 >> 1 = 8, oppure 16 >> 2 = 4, o anche 3 << 1 = 6 ,16 << 2 = 64)
e altre amenità (es. lo xor per azzerare le variabili, ecc) spesso retaggio
del codice assembler.
Adesso però l'assembler si usa di meno e i compilatori sono spesso
ottimizzanti al punto tale
da produrre codice equivalente senza il nostro aiuto (anche se il mio
personale parere e che ormai
con 64-128 Mb di ram, neanche i produttori di compilatori si preoccupano
di produrre codice super-ottimizzato).
--
----------
Lello Mele
c/o VTM VideoTecnica Mele
Via San Sebastiano, 22
84036 Sala Consilina (SA)
Cell.:0347/643.35.25
HOMEPAGE:
http://www.lellomele.supereva.it
eMAIL:
v...@libero.it
me...@programmazione.it
-------------
"Esistono due modi per elaborare il progetto di un software.
 Il primo consiste nel renderlo semplice al punto tale che non
 manifesti lacune evidenti. Il secondo consiste nel renderlo
 complicato al punto tale che non manifesti lacune evidenti.
 Il primo metodo e' di gran lunga piu' difficile." [C.A.R. Hoare]