To pytanie, które przyszło mi do głowy, czytając genialną odpowiedź Mysticial na pytanie: dlaczego szybciej jest przetwarzać posortowaną tablicę niż nieposortowaną ?
Kontekst dla zaangażowanych typów:
const unsigned arraySize = 32768;
int data[arraySize];
long long sum = 0;
W swojej odpowiedzi wyjaśnia, że kompilator Intel (ICC) optymalizuje to:
for (int i = 0; i < 100000; ++i)
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
sum += data[c];
... w coś równoważnego z tym:
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
for (int i = 0; i < 100000; ++i)
sum += data[c];
Optymalizator rozpoznaje, że są one równoważne i dlatego wymienia pętle , przesuwając gałąź poza pętlę wewnętrzną. Bardzo mądry!
Ale dlaczego tego nie robi?
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
sum += 100000 * data[c];
Miejmy nadzieję, że Mysticial (lub ktokolwiek inny) może udzielić równie genialnej odpowiedzi. Nigdy wcześniej nie dowiedziałem się o optymalizacjach omówionych w tym drugim pytaniu, więc jestem za to naprawdę wdzięczny.