Bu, Mysticial'ın şu soruya verdiği parlak cevabı okurken akla gelen bir sorudur: Neden sıralı bir diziyi sıralanmamış bir diziden daha hızlı işlemek ?
İlgili türler için bağlam:
const unsigned arraySize = 32768;
int data[arraySize];
long long sum = 0;
Cevabında Intel Compiler'ın (ICC) bunu optimize ettiğini açıklıyor:
for (int i = 0; i < 100000; ++i)
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
sum += data[c];
... buna eşdeğer bir şeye:
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
for (int i = 0; i < 100000; ++i)
sum += data[c];
İyileştirici, bunların eşdeğer olduğunun farkındadır ve bu nedenle döngüleri değiştirerek dalı iç döngünün dışına hareket ettirir. Çok zeki!
Ama bunu neden yapmıyor?
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
sum += 100000 * data[c];
Umarım Mysticial (veya başka biri) eşit derecede parlak bir cevap verebilir. Diğer soruda tartışılan optimizasyonları daha önce hiç öğrenmemiştim, bu yüzden bunun için gerçekten minnettarım.
volatile
olsaydı, döngü değişimi de geçersiz bir optimizasyon olurdu.