PDA

Visualizza la versione completa : [C] Ottimizzazione Codice


Reinaldo93
01-09-2017, 12:04
Com'è possibile ottimizzare questa porzione di codice C?

for(k=0; k<5; k++){
D[k][k]+=dlam[k];
for(i=0; i<5; i++){
for(z=0; z<5; z++){
if(k<3 && z<3){
q[k][i]+=(T1vec[k][z])*(Q1[z][i]);
}
if(k>=3 && z>=3){
q[k][i]+=(T2vec[k-3][z-3])*(Q1[z][i]);
}
}
qT[i][k]=q[k][i];
}
}
for(j=0; j<5; j++){
for(k=0; k<5; k++){
for(i=0; i<5; i++){
for(z=0; z<5; z++){
Z[j][k]+=q[j][z]*D[z][i]*qT[i][k];
}
}
}
}
for(k=0; k<3; k++){
for(i=k+2; i<5; i++){
Z[k][i]=0;
Z[i][k]=0;
}
}
Z[2][3]=1;
Z[3][2]=1;

Scara95
01-09-2017, 12:32
Maggiori informazioni sarebbero gradite. In ogni caso stai evidentemente calcolando dei valori di Z che non è necessario calcolare in quanto saranno settati a 0 o a 1, lo stesso può valere per altri valori che potrebbero essere necessari solo al calcolo di questi valori di Z.

Il primo loop può essere diviso in due loop distinti per le due condizioni che sono mutualmente esclusive, ciò elimina delle condizioni e anche dei cicli inutili in cui non faresti comunque nulla.

Questo è quello che vedo a colpo d'occhio, potrebbe esserci altro ma sarebbe utile del contesto e del codice indentato.

Reinaldo93
01-09-2017, 14:17
Quindi, come si può implementare, senza calcolari i valori di Z che saranno poi settati a 0 o a 1?
Z è stata definita come una matrice 5*5, di tutti zeri, ovvero:
Z[5][5]={{0, 0, 0, 0, 0},{0, 0, 0, 0, 0},{0, 0, 0, 0, 0},{0, 0, 0, 0, 0},{0, 0, 0, 0, 0}}

Scara95
02-09-2017, 13:21
Costruisci un grafo delle dipendente, ogni volta che utilizzi un altro valore aggiungi un arco verso quel nodo, ogni volta che fai un'assegnazione (solo =) cancella tutti gli archi uscenti. Aggiungi un super nodo che punta ai valori finali che ti interessa calcolare. Costruisci il grafo trasposto.
Ogni nodo che nel grafo trasposto non ha archi uscenti (ad eccezione del super nodo) non ci interessa calcolarlo. Puoi cancellare tutti gli archi entranti nel grafo trasposto e gli archi uscenti nel grafo originale. Ripeti finché non ci sono più cambiamenti.
I nodi che riesci a raggiungere partendo dal super nodo nel grafo originale modificato sono i nodi che ti serve calcolare. Se ne fai un ordine topologico ti assicuri anche delle dipendenze.
Se scrivi giù ogni riga in ordine topologico senza cicli non puoi ottimizzare di più, se controllando gli indici costruisci dei cicli minimi hai una buona ottimizzazione.
Se prendi la differenza fra tutti i nodi e i nodi che hai necessità di calcolare puoi vedere quali non hai necessità di calcolare e cambiare gli indici attuali o i cicli attuali di conseguenza.

Loading