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

Salve a tutti, scusate la banalita' della richiesta,
ma sul materiale didattico su cui studio il linguaggio non
ho trovato una risposta.
Programmo con soddisfazione da un po' tempo in Fortran95 che
credo sia un buon linguaggio per i miei scopi.
Pero' prefrerirei usare un linguaggio piu' diffuso e con
vasto supporto in rete.
Dopo una veloce analisi ho scelto il C++, ho afferrato il manuale, e letto
tutto cio' che mi serviva (non programmo ad oggetti).
Sono passato qundi a realizzare il port del programa al quale sto
lavorando attualmente per la tesi, ma nella traspozione da un linguaggio
ad un altro mi e' sorta una questione, il problema e' facilmente
aggirabile riorganizzando l'algoritmo, ma la questione e' simpatica dal
punto di vista dell'ottimizzazione.
In F95 i vettori che vengono allocati dinamicante hanno una funzione che
mi permette di sapere se la memori e' gia' allocata o meno, mi spiego
meglio con due righe di codice.
Fortran95
program prova
 implicit none
 integer :: i
 integer, allocatable :: x(:)
 do i=1,1000000
   if (.NOT. allocated(x)) allocate(x(1))
   x = 1212121
 enddo
end program prova
cioe' se x non e' allocato, viene allocato, e cio' permette nel casi si
debba farei ricoso ad allocazioni o dellocazioni continue un risparmio in
termini di tempo, infatti compilando ottengo:
$ time -p ./prova_f95 
real 0.04
user 0.04
sys 0.00
I c++ l'unico modo che conosco per riprodurre quello che mi occorre e'
deallocare, ma cio' da luogo a un decadimento delle prestazioni.
#include<iostream>
int main(void)
{
  using namespace std;
  int *a;
 
  for(int i=0;i<1000000;i++)
    {
      a = new int;
      *a = 1212121;
      delete(a);
    }
  return 0;
}
che compilato mi da:
$ time -p ./prova_cpp 
real 0.73
user 0.73
sys 0.00
Esiste un modo nativo, cio' diretto in C++ per controllare se un certo
dato e' gia' stato allocato in memoria?
P.S.: So esattamente che negli esempi fatti una sana programmazione
consiglia di allocare la memoria prima dei cicli e poi usarla riscrivendo
la variabili ad ogni iterazione.
Il codice da cui ho tratto spunto e' differente quello che ho postato e'
solo per concentrare l'attenzione sul problema.
Come si fa in C++?
Grazie

 la variabili ad ogni iterazione.
Ecco, appunto.
Tutto cio' secondo me non ha molto senso, ma magari in altro contesto...
(es: non ha molto senso allocare dinamicamente un solo int).
In generale, comunque, tradurre da un linguaggio ad un altro e' un po'
come tradurre da una lingua all'altra: certi costrutti non esistono in
tutte e certi modi di dire non li puoi tradurre pari pari...
 bye
	av.

 la variabili ad ogni iterazione.
In particolare in C++ useresti un array locale.
Ciao,
Nicola

 }
Stavo studiando vector, proprio oggi :)
Credo che c++ nonstante la sua complessita sia veramente comodo, e
per progetti non molto estesi anche semplice.
Pero' su una cosa vorrei dei chiarimenti, usando vector ho un eccessivo
calo di prestazioni?
Questo mi e' venuto in mente semplicemente notando che la compilazione di
un semplice file e' stata molto lunga, quindi ho dedotto che il
compilatore macina molto piu' del mio prova.cpp :)
Grazie a tutti per le risposte siete stati chiarissimi


Se lo fai per una tesi in cui devi fare anche calcoli ti consiglio di 
dare uno sguardo anche alla classe valarray che è più orientata ad un 
uso scientifico.
ciao Alex

 compilatore macina molto piu' del mio prova.cpp :)
Purtroppo l'uso dei template rende esplicite alcune intrerdipendenze
che portano a compilare centinaia di migliaia di linee di codice ogni
volta che includi uno header della libreria standard (in particolare
sotto windows anche perche' e' impossibile accedere solo ad alcune
primitive di sistema ma e' necessario includere windows.h).
Ciao,
Nicola

 calo di prestazioni?
no vector in tre implementazioni da me testate (i dettagli interni della 
libreria non sono standard) ovvero Gnu g++, intel icc, Microsoft toolkit 
2003 ha le stesse prestazioni in accesso di elemento di un array di 
basso livello ed è veloce  come l'equivalente codice scritto in fortran 
90 (anzi c++ con g++ o microsoft batte in codice semplice intel con 
ifort per l'f90 o icc per il c++).
Quello che puo' cambiare sensibilmente è il numero di reallocazioni 
necessario quando si aggiungono elementi con il push_back, operazione 
frequente con i vector.
la libreria GNU raddoppia la capacità del vector quando è arrivato a 
fine corsa
Intel triplica
Microsoft aumenta del 50 per cento...
maggiore occupazione di memoria implica minor numero di reallocazioni e 
quindi programma piu' veloce.
Il programmatore puo' pero' con delle stime la funzione membro reserve() 
  scavalcare questo problema.
-- 
Hai recensioni nel cassetto di musica, cinema, letteratura,fumetti??
Ascolta e pentiti e se hai tempo vergognati
http://tonysuper.altervista.org

 valarray non se la cavano proprio bene.
Mi sa che Blitz++ non e' piu' mantenuta, o sbaglio? Prova a guardare
se uBlas, che fa parte delle librerie Boost - 
www.boost.org
, fa al
caso tuo.
Ciao,
Nicola

 valarray non se la cavano proprio bene.
benchmark poco corretto perchè le "valarray" non esistono ovvero 
cambiano da compilatore a compilatore o addirittura da versione diversa 
dei singoli compilatori.
La libreria standard è scritta in c++ di basso livello e di solito puoi 
addirittura divertirti a leggerne il sorgente spulciando negli headers 
ed accorgerti delle differenze fra le varie implementazioni.
Il valarray è una classe che non è molto popolare e non è raro trovare 
implementazioni in cui vector è piu' efficiente perchè piu' curata. 
All'inizio si pensava che la capacità di ridimensionarsi di vector piu' 
altre strutture avanzate della STL come iteratori eccetera avrebbero 
potuto rallentare le prestazioni e quindi si penso' di progettare una 
classe piu' scarna e leggera apposta per il calcolo numerico.. ovvero 
valarray.
Pero' basto' poco tempo per capire che vector se ben progettata è veloce 
uguale e per questo ha raggiunto molta piu' popolarità fra i 
programmatori. (O almeno questa è la mia impressione).
Il valarray della libreria standard GNU ultima versione (ottimo perchè è 
scritto secondo tecniche avanzatissime di template metaprogramming che 
fanno si' che scrivere A=B+D/f-E; sia praticamente equivalente a for 
(size_t i=0;i<A.size();i++) A[i]=B[i]*D[i]/f-E[i];) dubito possa perdere 
  benchmark con altre librerie, al piu' pareggiare.


 Intel triplica
[cut]
Ecco sono sempre piu' interessato ;)

 
Lo immaginavo :(
Comunque non e' un problema, e' da una settimana che maneggio il
deitel&deitel e piu' leggo piu' capisco quanto il C++ si adatto ad
applicazioni numerico scientifiche (cosa per cui trovo il C assolutamente
inadeguato), peccatto che ho perso molto tempo a studiare C,
per poi abbandonarlo e passare a F95 investendo molto tempo in
quest'ultimo :(
Grazi per le risposte


Mah... per la mia esperienza direi che i valarray (nelle implementazioni che
ho usato io) hanno le stesse prestazioni dell'uso degli array "stile C" con
l'aggiunta di una serie di metodi già implementati molto comodi.
Anzi, alcuni test che avevo fatto mi davano prestazioni leggermente migliori
coi valarray che con la mia implementazione.
Se poi sia una valutazione da generalizzare, non so.
Dipende da quali operazioni devi fare.
Comunque anch'io ti constiglio le librerie di Boost o la MTL.
Ciaociao!
-- 
Gerolamo