यह एक सवाल है जो Mysticial द्वारा शानदार जवाब पढ़ने के दौरान दिमाग में आया: why is it faster to process a sorted array than an unsorted array? शामिल प्रकार के लिएकंपाइलर एक गुणा में एक अनुमानित अतिरिक्त लूप को अनुकूलित क्यों नहीं कर सकता (या नहीं)?
प्रसंग:
const unsigned arraySize = 32768;
int data[arraySize];
long long sum = 0;
अपने जवाब में वे बताते हैं कि इंटेल संकलक (आईसीसी) का अनुकूलन इस:
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];
उम्मीद है कि मिस्टिक (या कोई और) समान रूप से शानदार जवाब दे सकता है। मैंने पहले कभी उस अन्य प्रश्न में चर्चा की गई अनुकूलन के बारे में कभी नहीं सीखा है, इसलिए मैं इसके लिए वास्तव में आभारी हूं।
हाँ, मैं भी यही सोच रहा था। संकलक ने इसे एक कदम आगे क्यों नहीं लिया? – Mysticial
ऐसा कुछ है जो शायद इंटेल जानता है। मुझे नहीं पता कि यह किस ऑर्डर को ऑप्टिमाइज़ेशन पास करता है। और जाहिर है, यह लूप-इंटरचेंज के बाद एक लूप-ढहने वाला पास नहीं चलाता है। – Mysticial
यह अनुकूलन केवल तभी वैध है जब डेटा सरणी में निहित मान अपरिवर्तनीय हैं। उदाहरण के लिए, यदि प्रत्येक बार जब आप डेटा पढ़ते हैं तो [मेमोरी मैप किए गए] (http://en.wikipedia.org/wiki/Memory-mapped_I/O) इनपुट/आउटपुट डिवाइस पर होते हैं [0] एक अलग मूल्य उत्पन्न करेंगे .. –