これは、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];
うまくいけば、ミスティック(または他の誰か)が同様に素晴らしい答えを与えることができます。他の質問で説明した最適化についてはこれまで学んだことがないので、本当に感謝しています。