Questa è una domanda che mi è venuta in mente mentre leggevo la brillante risposta di Mysticial alla domanda: perché è più veloce elaborare un array ordinato che un array non ordinato ?
Contesto per i tipi coinvolti:
const unsigned arraySize = 32768;
int data[arraySize];
long long sum = 0;
Nella sua risposta spiega che Intel Compiler (ICC) ottimizza questo:
for (int i = 0; i < 100000; ++i)
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
sum += data[c];
... in qualcosa di equivalente a questo:
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
for (int i = 0; i < 100000; ++i)
sum += data[c];
L'ottimizzatore sta riconoscendo che questi sono equivalenti e pertanto scambia i loop , spostando il ramo all'esterno del loop interno. Molto intelligente!
Ma perché non lo fa?
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
sum += 100000 * data[c];
Speriamo che Mysticial (o chiunque altro) possa dare una risposta altrettanto brillante. Non ho mai appreso delle ottimizzazioni discusse in quell'altra domanda prima, quindi sono davvero grato per questo.
volatile, allora l'interscambio di loop sarebbe anche un'ottimizzazione non valida.