这是我在阅读 神秘对这个问题的精彩回答时想到的一个问题: 为什么处理排序的数组比处理未排序的数组更快?
所涉及类型的上下文:
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];
希望神秘博士(或者其他人)能够给出一个同样精彩的答案。我以前从来没有学过这个问题中讨论的优化,所以我真的很感激。