Ho due domande correlate una generale e una specifica per il progetto su cui sto lavorando.loop, design della funzione ed efficienza: due domande
- In generale se ho un ciclo con un sacco di iterazioni (milioni), con alcune parti del codice eseguito in determinate condizioni, è meglio (più efficiente) per avere un ciclo con più istruzioni condizionali o cicli multipli senza loro. Per esempio.
Esempio 1:
while (something())
{
// some common code
if (condition_a)
// some code
if (condition_b)
// some code
// some more common code
}
Esempio 2:
if (condition_a && condition_b)
{
while (something())
{
// some common and specific code
}
}
else if (condition_a)
while (something()) //..
else if (condition_b)
// Another loop
else //...
Sembra esempio 2 comporterebbe codice più efficiente al costo di ridondanza perché le condizioni vengono controllate solo una volta anziché milioni di volte. Se il codice comune è enorme, o ci sono molte possibili condizioni, questo sembra estremamente ridondante.
Ora al mio problema specifico. Ho una funzione che legge i punti da un file e li inserisce in una struttura dati. Sembra qualcosa di simile:
mentre (lettore-> read_point) {// fare alcune cose // punto di inserimento }
Il problema è che ci sono diverse funzioni per la lettura di un punto che dovrebbe essere utilizzato in base ai criteri forniti dall'utente. Per esempio read_point_inside_circle(), read_point_inside_rectangle() ecc.
Idealmente mi piacerebbe utilizzare un puntatore a funzione per decidere in anticipo la funzione corretta, tuttavia non penso sia possibile poiché il lettore è un'istanza di una classe Reader (se è possibile in qualche modo risolverebbe tutti i miei problemi).
In questa situazione è meglio se ho cicli multipli che differiscono solo dalla condizione o dovrei usare più istruzioni if per evitare codice ridondante, ad es.
for(;;)
{
if (read_every_point)
if(!reader->read_point())
break;
else if (read_inside_circle)
if(!reader->read_inside_circle())
break;
else if // ...
}
Dubito che il primo avrà alcun effetto in qualsiasi compilatore moderno. Vorrei andare con ciò che è più leggibile e lasciare che il compilatore lo ottimizzi per me. – amit