Newsgroup: it.comp.lang.c++
Titolo: dal fortran al C++

Salve a tutti,
  dopo anni e anni di fortran ho deciso di abbandonarlo e passare al
C++. La maggior parte dei programmi che scrivo sono per applicazioni di
tipo scientifico.
La prima cosa che sto facendo consiste nel riscrivere  certi programmi
che ho scritto in fortran tempo fa. Il mio problema e' il seguente:
utilizzando le classi, scrivo applicazioni che mi sembrano molto
migliori di quelle scritte in fortran, piu' semplici da usare,
versatili, maneggevoli ma...lente.
  E' frustrante perche' alla fine della giornata sono di solito molto
soddisfatto del mio nuovo programma, ma quando lo faccio girare scopro
quasi sempre di avere perso in velocita'  rispetto al fortran; a volte
il programma in C++ e' addirittura 8 volte piu' lento, pur essendo
(secondo me) superiore in molti altri aspetti.
  Ora, capisco che in parte questo debba accettarsi come un prezzo da
pagare, ma sono abbastanza convinto di stare sbagliando qualche cosa. La
mia domanda e': che cosa posso usare per capire dove sia il collo di
bottiglia ? Esistono delle applicazioni che mi dicano, ad esempio, a
quale punto il programma si insabbi ? L'ambiente in cui lavoro e' Linux,
per cui utilizzo g++
  Mi rendo conto che questa possa essere una domanda posta
frequentemente, ma non sono riuscito a trovare le FAQs. Grazie in
anticipo per l'aiuto.
Saluti,
Massimo
--
Massimo Boninsegni
Department of Physics
San Diego State University
http://rainbow.sdsu.edu/~massimob

, Massimo Boninsegni


per cui utilizzo g++
Si`, Linux/g++ include un profiler, che dovrebbe permetterti di avere un
"profilo di prestazione" delle tue applicazioni, che, in generale, e` uno
dei
migliori approcci all'ottimizzazione, visto che i colli di bottiglia tendono
ad
essere "concentrati" nel 10-20% del programma; sono un po' arrugginito
in materia, ma mi pare che si trattasse di usare un certo switch (-p?) in
fase di compilazione e link, e un programma (gperf?  O e` il generatore
di perfect hash?-) a posteriori per analizzare le "tracce".
Per il problema specifico della transizione Fortran->C++, tuttavia, puoi
anche perseguire parallelamente altre strade.  Anzitutto, ti consiglio il
testo di Barton e Nackmann, due ricercatori dell'IBM che hanno fatto
questa transizione per vari pesanti codici numerici e hanno sviluppato
di conseguenza un'elevata sensibilita` su questi problemi di prestazioni,
e vari idiomi/approcci molto utili per questo tipo di lavori; il loro testo,
del 1994, preconizza idiomi e pattern di progetto che sono poi divenute
parte della "cultura generale" della comunita` C++ "scientifica".
Inoltre, potresti scaricare dalla rete Blitz++, una libreria di template
C++ che utilizza un approccio assai diverso per ottenere prestazioni
a volte sbalorditive: in pratica, le capacita` di "generic programming"
del C++ sono messe al servizio del compito di calcolare a compile time
tutto quanto sia umanamente possibile, a colpi di template.  A seconda
del compilatore a tua disposizione, la compilazione puo` rallentare
(sarebbe consigliabile scaricare egcs, che e` il release piu` recente
di gcc, da 
www.cygnus.com
; esso e` molto aggiornato allo standard,
e in particolare ha una migliore gestione dei template, rispetto alle
precedenti release gcc, come le varie 2.7 e 2.8), ma l'esecuzione tende
invece ad essere ottimale.
Non occorre impadronirsi pienamente di queste tecniche per trarne
beneficio, visto che la libreria e` usabile anche relativamente "a
scatola nera" -- proprio come, a suo tempo, IMSL, NAG, eccetera,
permettevano di svolgere algebra lineare rapida e precisa anche
senza la necessita` di diventare maghi dell'analisi numerica:-).  Ma,
certo, capendo meglio i meccanismi se ne puo` trarre beneficio
maggiore, ad esempio estendendoli ai propri specifici calcoli.
Alex