Sono un programmatore Java abbastanza competente che è molto nuovo per C. Sto cercando di ottimizzare una routine che ha quattro modalità operative.Sovraccarico di un'istruzione switch in C
I loop su tutti i pixel di un'immagine e calcola un nuovo valore di pixel in base alla "modalità" passata.
La mia domanda riguarda il sovraccarico di un'istruzione switch all'interno di due cicli annidati. Sarei interessato a qualsiasi link alla documentazione riguardante l'efficienza relativa delle istruzioni di base C, matematica e operazioni logiche.
Il codice dovrebbe essere come segue;
for (x = 0; x < width; x++) {
for (y = 0; y < height; y++) {
switch (mode) /* select the type of calculation */
{
case 0:
weight = dCentre/maxDistanceEdge;
case 1:
weight = (float)x/width;
break;
case 2:
weight = (float)y/height;
break;
case 3:
weight = dBottomLeft/maxDistanceCorner;
break;
case 4:
weight = dTopRight/maxDistanceCorner;
break;
default:
weight = 1;
break;
}
// Calculate the new pixel value given the weight
...
}
}
Ci si aspetterebbe di vedere molte spese generali se si tratta di un'immagine di 5000 x 5000 pixel? Ho provato a fare qualche test, ma i miei risultati sono dappertutto perché il sistema (dispositivo mobile) ha tutti i tipi di roba in esecuzione in background che potrebbero distorcere i risultati.
L'altra opzione consiste nell'avere un metodo separato per ciascuna modalità, ognuna con i suoi quattro loop. Questo ovviamente introdurrebbe codice ridondante ma l'efficienza è il nome del gioco qui.
Grazie in anticipo!
Gav
Questo probabilmente dipenderà più dai flag di ottimizzazione del compilatore e del compilatore che dal codice. Puoi dirci quale compilatore stai usando e quali flag stai passando, se ce ne sono? – anthony
Una cosa: se stai andando a fare più di un po 'di codice in questo ambiente, ti incoraggio a capire come controllarlo in modo da poter eseguire analisi delle prestazioni (disattivare la wireless, interrompere le attività in background, ecc. , eccetera). Se non riesci a trovare una piattaforma stabile per testare il tuo tempismo, non saprai mai con certezza cosa sta succedendo. –
Dato che pesate sempre = a/b, potete creare due array di dimensione 5 e indicizzarli usando "mode".quindi sembra peso = a1 [modo]/a2 [modo]; Nessun ramo quindi. –