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.