这是一个问题,当我阅读由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(或其他人)能给出同样出色的回答。我以前从未学过那个问题中讨论的优化方法,所以我对此非常感激。