Ho un segmento di codice che è il più semplice:Intel C++ Compiler comprensione di ciò che l'ottimizzazione viene eseguita
for(int i = 0; i < n; ++i)
{
if(data[i] > c && data[i] < r)
{
--data[i];
}
}
E 'una parte di una grande funzionalità e di progetto. Questo è in realtà una riscrittura di un ciclo diverso, che ha dimostrato di essere in termini di tempo (lunghi loop), ma sono rimasto sorpreso da due cose:
Quando i dati [i] era temporaneo salvato in questo modo:
for(int i = 0; i < n; ++i)
{
const int tmp = data[i];
if(tmp > c && tmp < r)
{
--data[i];
}
}
È diventato molto più lento. Non pretendo che questo dovrebbe essere più veloce, ma non riesco a capire perché dovrebbe essere molto più lento, il compilatore dovrebbe essere in grado di capire se il tmp dovrebbe essere usato o meno.
Ma ancora più importante quando ho spostato il segmento di codice in una funzione separata è diventato circa quattro volte più lento. Volevo capire cosa stava succedendo, quindi ho esaminato il referto opt-report e in entrambi i casi il ciclo è stato vettorializzato e sembra che faccia la stessa ottimizzazione.
Quindi la mia domanda è che cosa può fare una tale differenza su una funzione che non è chiamata un milione di volte, ma richiede molto tempo? Cosa cercare nel rapporto opt-?
Potrei evitarlo semplicemente mantenendolo in linea, ma il motivo è che mi infastidisce.
UPDATE:
dovrei sottolineare che la mia preoccupazione principale è quello di capire, perché è diventato più lento, quando viene spostato ad una funzione separata. L'esempio di codice fornito con la variabile tmp, era solo uno strano esempio che ho incontrato durante il processo.
Proprio la domanda obbligatoria: hai ottimizzazioni max su tutte le build? – GManNickG
Prova a dare un'occhiata all'assieme generato. –
Sì, tutto è compilato con O3. Non ho ancora esaminato l'assemblea, semplicemente perché, come detto, è parte di un grande progetto (anche perché non sono un esperto di assemblaggio). –