यह एक ऐसा सवाल है जो मिस्टिकियल के शानदार जवाब को पढ़ते हुए दिमाग में आया : एक अनारक्षित सरणी की तुलना में सॉर्ट किए गए सरणी को संसाधित करना अधिक तेज़ क्यों है ?
शामिल प्रकारों के लिए संदर्भ:
const unsigned arraySize = 32768;
int data[arraySize];
long long sum = 0;
अपने जवाब में वे बताते हैं कि इंटेल कंपाइलर (ICC) इस का अनुकूलन करता है:
for (int i = 0; i < 100000; ++i)
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
sum += data[c];
... इसके बराबर में:
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
for (int i = 0; i < 100000; ++i)
sum += data[c];
ऑप्टिमाइज़र पहचान रहा है कि ये बराबर हैं और इसलिए छोरों का आदान-प्रदान कर रहे हैं, शाखा को आंतरिक लूप के बाहर स्थानांतरित कर रहे हैं। बहुत चालाक!
लेकिन यह ऐसा क्यों नहीं करता है?
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
sum += 100000 * data[c];
उम्मीद है कि मिस्टिकियल (या कोई भी) एक समान रूप से शानदार जवाब दे सकता है। मैंने पहले कभी उस दूसरे प्रश्न में चर्चा की गई अनुकूलन के बारे में नहीं सीखा है, इसलिए मैं इसके लिए वास्तव में आभारी हूं।
volatile
, तो लूप इंटरचेंज एक अमान्य ऑप्टिमाइज़ेशन होगा।