Это вопрос, который пришел на ум, когда читал блестящий ответ Mysticial на вопрос: почему быстрее обрабатывать отсортированный массив, чем несортированный массив?
Контекст для задействованных типов:
const unsigned arraySize = 32768;
int data[arraySize];
long long sum = 0;
В своем ответе он объясняет, что Intel Compiler (ICC) оптимизирует это:
for (int i = 0; i < 100000; ++i)
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
sum += data[c];
... в нечто эквивалентное этому:
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
for (int i = 0; i < 100000; ++i)
sum += data[c];
Оптимизатор распознает, что они эквивалентны и поэтому обмениваются петлями, перемещая ветвь вне внутреннего цикла. Очень умный!
Но почему он этого не делает?
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
sum += 100000 * data[c];
Надеюсь, Мистик (или кто-либо еще) может дать столь же блестящий ответ. Я никогда не узнавал об оптимизации, обсуждавшейся в этом другом вопросе раньше, поэтому я очень благодарен за это.