ciclo efficiente
Von: adriano meis (umiumiumi@invalid.it) [Profil]
Datum: 03.07.2008 19:37
Message-ID: <t78bk.20330$Ca.14620@twister2.libero.it>
Newsgroup: it.comp.lang.c
Datum: 03.07.2008 19:37
Message-ID: <t78bk.20330$Ca.14620@twister2.libero.it>
Newsgroup: it.comp.lang.c
Salve,
ho win98 ed il dev c++.
Ammettiamo che io debba eseguire nella maniera efficiente (ottimizzata) la
funzione:
f(double *s,double *sp,double *sd, int N)
dove:
s, N sono gli argomenti di ingresso
sp, sd, sono gli argomenti di uscita
s, sd, sp sono i vettori
Il cuore della funzione è il codice che segua:
////////////////////////////////////////////////////////////////////////////
///////
int N;
...
for(i=0;p<N/4;p++)
{
sp[p]=s[p]-s[N/2-p];
sd[p]=s[p]+s[N/2-p];
}
////////////////////////////////////////////////////////////////////////////
///////
allora come conviene agire?
1)lo lascio così;
2)lo riscrivo così:
////////////////////////////////////////////////////////////////////////////
///////
int N, N2, N4;
...
N2=N/2;
N4=N/4;
for(i=0;p<N4;p++)
{
sp[p]=s[p]-s[N2-p];
sd[p]=s[p]+s[N2-p];
}
////////////////////////////////////////////////////////////////////////////
///////
Oppure i compilatori di oggi sono abbastanza intelligenti da capire da soli
che, nella prima
versione del codice, i calcoli: "N/2", "N/4" non convenga ripeterli ad
ogni
iterazione del ciclo,
ma
convenga calcolarli la singla volta per tutte, coniando delle variabili ad
hoc per contenerli?
Ammettiamo che valga questa questa seconda ipotesi.
Ora però secondo me nche in questo caso l efficienza del C non sarà ottima.
Infatti come fa il C
a capire a priori (già in fase di compilazione, prima di
conoscere il valore di N) quale tipo di dato impiegare per contenere:
"N1/2" o "N1/4"? Chi gli assicura che basta il tipo int? Io so che N
sarà in
ogni caso la potenza
del 2, e pertanto N2 ed N4 saranno anch'esse del tipo int.
Invece esso non può saperlo, e pertanto, per non sbagliare, è indotto
gestirli come "double".
Sbaglio?
E' corretto dunque dedurre che in ogni caso, la 2° versione del codice, sarà
più efficiente della
prima.
Ora io chiedo: la 2° versione del codice sarà più efficente anche se
questo
codice lo
implementassi in
Matlab (opportunmente tradotto), oppure queste considerazioni valgono solo
nel C?
grazie,
adriano
[ Auf dieses Posting antworten ]