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.