Esta é uma pergunta que veio à mente ao ler a brilhante resposta de Mysticial à pergunta: por que é mais rápido processar uma matriz classificada do que uma matriz não classificada ?
Contexto para os tipos envolvidos:
const unsigned arraySize = 32768;
int data[arraySize];
long long sum = 0;
Em sua resposta, ele explica que o Intel Compiler (ICC) otimiza isso:
for (int i = 0; i < 100000; ++i)
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
sum += data[c];
... em algo equivalente a isso:
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
for (int i = 0; i < 100000; ++i)
sum += data[c];
O otimizador está reconhecendo que eles são equivalentes e, portanto, está trocando os loops , movendo o ramo para fora do loop interno. Muito esperto!
Mas por que não faz isso?
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
sum += 100000 * data[c];
Esperemos que Mysticial (ou qualquer outra pessoa) possa dar uma resposta igualmente brilhante. Eu nunca aprendi sobre as otimizações discutidas nessa outra pergunta antes, então estou muito agradecido por isso.
volatile
, o intercâmbio de loop também seria uma otimização inválida.