Sto traducendo un software da una vecchia lingua in c ++ e sono attualmente in fase di ottimizzazione. Il software esegue un calcolo dei carichi per più elementi in un numero di timestep, ognuno dei quali è costituito da diversi cicli iterativi.
Il mio caso di test corrente contiene 400 timestep, ciascuno con 13 loop iterativi, ognuno dei quali calcola carichi per 12 elementi. Ora, se i carichi risultanti superano una soglia definita, l'articolo viene considerato perso e rimosso dal calcolo. Il problema che sto riscontrando è che il tempo di calcolo aumenta notevolmente se si tiene conto del fatto che gli elementi potrebbero andare persi, anche se il calcolo li salta, cosa che pensavo avrebbe ridotto il tempo di esecuzione.
Gli elementi sono memorizzati come std::vector<loads_item*> items
e quello che sto valutando alla fine di ogni ciclo è:
void loads_item::check_excessive_forces()
{
if (abs(this->force_x) > this->force_x_max) {
this->lost = true;
}
}
con il calcolo del carico controllando questo flag come:
void loads_container::calc_loads(...)
{
for (size_t i = 0; i < this->items.size(); i++) {
if (this->items[i]->is_lost()) { continue; }
this->items[i]->calc_loads(...);
...
}
}
Il tempo di esecuzione è di circa 4,8 secondi. Se rimuovo l'istruzione continue
scende a circa 2,7 secondi.
Non ho molta familiarità con l'ottimizzazione, si tratta di un problema di previsione delle filiali? Il modello per la valutazione passerebbe da FFFFFFFFFFFF
a TFFFFFTFFFFT
nel corso della corsa, ma questo mi sembra piuttosto eccessivo. Mi manca qualcosa di ovvio? Ovviamente potrei scambiare il bool
con int
e moltiplicare i risultati per eliminare la ramificazione, ma questo mi sembra brutto e esattamente quello che cerco di evitare.