这是在阅读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];
希望神秘主义者(或其他任何人)可以给出同样出色的答案。我之前从未了解过其他问题中讨论的优化,所以我非常感谢。