Esta es una pregunta que se me ocurrió al leer la brillante respuesta de Mysticial a la pregunta: ¿por qué es más rápido procesar una matriz ordenada que una matriz sin clasificar ?
Contexto para los tipos involucrados:
const unsigned arraySize = 32768;
int data[arraySize];
long long sum = 0;
En su respuesta, explica que el Compilador Intel (ICC) optimiza esto:
for (int i = 0; i < 100000; ++i)
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
sum += data[c];
... en algo equivalente a esto:
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
for (int i = 0; i < 100000; ++i)
sum += data[c];
El optimizador reconoce que estos son equivalentes y, por lo tanto, intercambiando los bucles , moviendo la rama fuera del bucle interno. ¡Muy inteligente!
¿Pero por qué no hace esto?
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
sum += 100000 * data[c];
Esperemos que Mysticial (o cualquier otra persona) pueda dar una respuesta igualmente brillante. Nunca antes había aprendido sobre las optimizaciones discutidas en esa otra pregunta, así que estoy realmente agradecido por esto.
volatile
, entonces el intercambio de bucles también sería una optimización no válida.