आम तौर पर, हाँ। लेकिन इसकी कोई गारंटी नहीं है, और उन जगहों पर जहां संकलक ऐसा करेंगे, शायद दुर्लभ हैं।
किसी भी समस्या के बिना अधिकांश कंपाइलर क्या करते हैं, लूप से अपरिवर्तनीय मूल्यांकन हो रहा है, उदा। यदि आपका हालत
if (a<b) ....
है जब ए और बी पाश से प्रभावित नहीं हैं, तुलना पाश से पहले एक बार किया जाएगा।
इसका मतलब है कि यदि संकलक निर्धारित कर सकता है कि स्थिति बदलती नहीं है, तो परीक्षण सस्ता है और कूदने की भविष्यवाणी की गई है। बदले में इसका मतलब है कि परीक्षण में स्वयं एक चक्र या कोई चक्र नहीं होता है (वास्तव में)।
लूप को विभाजित करने वाले मामलों में कौन सा मामला फायदेमंद होगा?
कोड के बारे में मान्यताओं क) एक बहुत तंग पाश जहां 1 चक्र एक महत्वपूर्ण लागत
ख) दोनों भागों के साथ पूरे पाश अब कोड कैश
फिट नहीं करता है, संकलक केवल कर सकते हैं कैश, और आमतौर पर कोड को इस तरह से ऑर्डर कर सकता है कि एक शाखा कैश फिट करेगी।
किसी भी परीक्षण के बिना, I'dexpect क) केवल इस मामले में जहां इस तरह के एक अनुकूलन लागू किया जाएगा, क्योंकि यह nto हमेशा बेहतर विकल्प है:
जिसमें पाश बंटवारे मामलों बुरा हो सकता है?
लूप को विभाजित करते समय कोड कैश से परे कोड आकार बढ़ाता है, तो आप एक महत्वपूर्ण हिट लेंगे। अब, यह केवल आपको प्रभावित करता है अगर लूप को किसी अन्य लूप के भीतर बुलाया जाता है, लेकिन ऐसा कुछ ऐसा होता है जो आमतौर पर संकलक निर्धारित नहीं कर सकता है।
मैं VC9 निम्नलिखित पाश
extern volatile int vflag = 0;
int foo(int count)
{
int sum = 0;
int flag = vflag;
for(int i=0; i<count; ++i)
{
if (flag)
sum += i;
else
sum -= i;
}
return sum;
}
[संपादित करें 2]
(कुछ मामलों में जहां यह वास्तव में फायदेमंद हो सकता है में से एक) विभाजित करने के लिए नहीं मिल सका [संपादित करें] ध्यान दें कि int flag = true;
के साथ दूसरी शाखा अनुकूलित हो जाती है। (और नहीं, कॉन्स यहां कोई फर्क नहीं पड़ता;))
इसका क्या अर्थ है? या तो इससे कोई फर्क नहीं पड़ता, इससे कोई फर्क नहीं पड़ता, मेरा विश्लेषण गलत है ;-)
आम तौर पर, मुझे लगता है कि यह एक अनुकूलन है जो केवल कुछ ही मामलों में मूल्यवान है, और किया जा सकता है ज्यादातर परिदृश्यों में आसानी से हाथ से।
उत्तर के लिए धन्यवाद। आपके विकिपीडिया लिंक से मुझे "लूप अनविचिंग" के लिए पृष्ठ मिला है, जो इस तरह के अनुकूलन के लिए एक और अधिक सटीक शब्द प्रतीत होता है। –
हालांकि शब्द वास्तव में कट और सूखे नहीं होते हैं, लूप-होस्टिंग और लूप-इनवेरिएंट-कोड-गति वास्तव में इस अनुकूलन का वर्णन करने के लिए उपयोग नहीं किया जाता है। वे एकल निर्देशों के लिए अधिक हैं। –
ओपी द्वारा संदर्भित 'लूप अनविचिंग' से लिंक: https://en.wikipedia.org/wiki/Loop_unswitching – BrodieG