这是在阅读Mysticial关于该问题的绝妙答案时想到的一个问题:为什么处理排序数组比未排序数组更快?
涉及的类型的上下文:
const unsigned arraySize = 32768;
int data[arraySize];
long long sum = 0;
他在回答中解释说,英特尔编译器(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];
希望Mysticial(或其他任何人)能给出同样出色的答案。我之前从未听说过其他问题中讨论过的优化,所以我对此非常感激。
volatile
,则循环交换也将是无效的优化。