के साथ सी/सी ++ में लूप के भीतर बयान के भीतर बयान के रूप में नेस्टेड अनुकूलित करें, मैं जीसीसी कंपाइलर का उपयोग कर सी/सी ++ में विभिन्न अनुकूलन का परीक्षण कर रहा हूं। बयान में अगर मेरे पास वर्तमान में एकाधिक घोंसले वाला लूप है। कार्यक्रम की निष्पादन की शुरुआत में स्थितियों की गणना की जाती है। यह इस तरह से कुछ हद तक दिखता है:जीसीसी
bool conditionA = getA();
bool conditionB = getB();
bool conditionC = getC();
//Etc.
startTiming();
do {
if(conditionA) {
doATrueStuff();
if(conditionB) {
//Etc.
} else {
//Etc.
}
} else {
doAFalseStuff();
if(conditionB) {
//Etc.
} else {
//Etc.
}
}
} while (testCondition());
endTiming();
कहाँ doATrueStuff()
एक इनलाइन समारोह तो वहाँ यह बुला में कोई भूमि के ऊपर है कि कुछ सरल संख्यात्मक गणना करता है।
दुर्भाग्य से, शर्तों को पहले से परिभाषित नहीं किया जा सकता है, उन्हें रनटाइम के दौरान गणना की जानी चाहिए। हम भरोसेमंद या गलत होने का मौका भी अनुमानित नहीं कर सकते हैं। getA()
rand()%2
भी हो सकता है। लेकिन एक बार गणना की, उनका मूल्य कभी नहीं बदलता है।
दो समाधान मैं की, एक होने के वैश्विक समारोह संकेत दिए गए कि पाश के भीतर उचित समारोह कॉल करने के लिए उपयोग किया जाता है, इस तरह सोचा है के होते हैं:
void (*ptrA)(void);
//Etc.
int main(int argc, char **argv) {
//...
if (conditionA) {
ptrA=&aTrueFunc;
} else {
ptrA=&aFalseFunc;
}
//...
do {
(*ptrA)();
} while (testCondition());
//...
}
इस तरह मैं से सभी शाखाओं को समाप्त कर सकते लूप, हालांकि तब मुझे कई फंक्शन कॉल का ओवरहेड होगा जो मुझे धीमा कर देगा।
या मैं बस की स्थिति के प्रत्येक संयोजन के लिए एक अलग पाश, कुछ इस तरह हो सकता है:
if(conditionA) {
if(conditionB) {
do {
//Do A == true B == true stuff
} while (testCondition());
} else {
do {
//Do A == true B == false stuff
} while (testCondition());
}
} else {
//Etc.
}
हालांकि कि बहुत कम खूबसूरत है और एक तो कुशलता से करने के लिए एक बार एक भी होने शुरू होता है असंभव हो जाता है कई स्थितियों, क्योंकि एक्स शर्तों के लिए एक को 2^एक्स loops लिखने की जरूरत है।
क्या यह अनुकूलित करने के लिए एक और अधिक सुरुचिपूर्ण/तेज़ तरीका है?
क्या इसमें कोई भी बिंदु है या संकलक किसी भी तरह से समझता है कि लूप के दौरान स्थिति बदलती नहीं है और इसे स्वयं अनुकूलित करती है?
और जिज्ञासा से बाहर, क्या कोई अन्य प्रोग्रामिंग भाषा है जो इस तरह के कोड को आसान/संभव बना देगी? या यह केवल एक बार स्मृति में लोड होने के बाद प्रोग्राम के निर्देशों को बदलने के लिए असेंबली का उपयोग करके संभव होगा?
पहला विचार मूल की तुलना में कोई और फ़ंक्शन कॉल नहीं दिखता है। –
सीपीयू शायद लूप के अंदर स्थित नहीं होने पर शाखा भविष्यवाणी के साथ बहुत अच्छी तरह से काम करेगा। – Carlton
ऐसा लगता है कि आपके पास पहले से ही 2^एक्स अलग-अलग ब्लॉक हैं। – Jarod42