Ini adalah pertanyaan yang muncul di benak saya ketika membaca jawaban brilian oleh Mysticial untuk pertanyaan: mengapa lebih cepat memproses array yang diurutkan daripada array yang tidak diurutkan ?
Konteks untuk jenis yang terlibat:
const unsigned arraySize = 32768;
int data[arraySize];
long long sum = 0;
Dalam jawabannya dia menjelaskan bahwa Intel Compiler (ICC) mengoptimalkan ini:
for (int i = 0; i < 100000; ++i)
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
sum += data[c];
... menjadi sesuatu yang setara dengan ini:
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
for (int i = 0; i < 100000; ++i)
sum += data[c];
Pengoptimal mengakui bahwa ini adalah setara dan karenanya bertukar loop , memindahkan cabang di luar loop dalam. Sangat pintar!
Tetapi mengapa tidak melakukan ini?
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
sum += 100000 * data[c];
Semoga Mysticial (atau siapa pun) dapat memberikan jawaban yang sama-sama brilian. Saya belum pernah belajar tentang optimasi yang dibahas dalam pertanyaan lain sebelumnya, jadi saya sangat berterima kasih untuk ini.
volatile, maka pertukaran loop akan menjadi optimasi yang tidak valid juga.