Đây là một câu hỏi xuất hiện trong khi đọc câu trả lời xuất sắc của Mysticial cho câu hỏi: tại sao xử lý một mảng được sắp xếp nhanh hơn một mảng chưa sắp xếp ?
Bối cảnh cho các loại liên quan:
const unsigned arraySize = 32768;
int data[arraySize];
long long sum = 0;
Trong câu trả lời của mình, anh giải thích rằng Trình biên dịch Intel (ICC) tối ưu hóa điều này:
for (int i = 0; i < 100000; ++i)
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
sum += data[c];
... thành một cái gì đó tương đương với điều này:
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
for (int i = 0; i < 100000; ++i)
sum += data[c];
Trình tối ưu hóa nhận ra rằng những cái này là tương đương và do đó trao đổi các vòng lặp , di chuyển nhánh bên ngoài vòng lặp bên trong. Rất thông minh!
Nhưng tại sao nó không làm điều này?
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
sum += 100000 * data[c];
Hy vọng rằng Mysticial (hoặc bất cứ ai khác) có thể đưa ra một câu trả lời xuất sắc không kém. Tôi chưa bao giờ tìm hiểu về các tối ưu hóa được thảo luận trong câu hỏi khác trước đây, vì vậy tôi thực sự biết ơn về điều này.
volatile
, thì trao đổi vòng lặp cũng sẽ là một tối ưu hóa không hợp lệ.