これは、質問に対するMysticialの素晴らしい答えを読んでいるときに思い浮かんだ質問です。なぜ、ソートされていない配列よりもソートされた配列を処理する方が速いのですか?
関連するタイプのコンテキスト:
const unsigned arraySize = 32768;
int data[arraySize];
long long sum = 0;
彼の答えで彼はIntel Compiler(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];
うまくいけば、ミスティック(または他の誰でも)も同様に素晴らしい答えを出すことができます。これまでに他の質問で説明した最適化について学んだことがないので、本当にありがたいです。
volatile
ループ交換も無効な最適化になります。