सबसे पहले:
एक do-whileपाश एक के समान नहीं है while-loop या एक for-loop।
while तथा for लूप्स लूप बॉडी को बिल्कुल नहीं चला सकते हैं।
- एक
do-whileलूप हमेशा लूप बॉडी को कम से कम एक बार चलाता है - यह प्रारंभिक स्थिति की जांच को छोड़ देता है।
तो यह तार्किक अंतर है। कहा कि, हर कोई इसका कड़ाई से पालन नहीं करता है। यह बहुत आम था whileया forछोरों तब भी जब यह है कि वह हमेशा पाश में कम से कम एक बार होगा की गारंटी है इस्तेमाल किया जा रहा। (विशेष रूप से फ़ॉरेस्ट लूप वाली भाषाओं में ।)
इसलिए सेब और संतरे की तुलना करने से बचने के लिए, मैं यह मानकर चलूंगा कि लूप हमेशा कम से कम एक बार चलेगा। इसके अलावा, मैं forफिर से छोरों का उल्लेख नहीं करूंगा क्योंकि वे अनिवार्य रूप से whileएक लूप काउंटर के लिए सिंटैक्स चीनी के एक बिट के साथ छोरों हैं ।
तो मैं इस सवाल का जवाब दूंगा:
यदि एक whileलूप को कम से कम एक बार लूप की गारंटी दी जाती है, तो क्या do-whileलूप का उपयोग करने से कोई प्रदर्शन लाभ होता है ।
एक do-whileपहली शर्त जांच को छोड़ देता है। इसलिए मूल्यांकन करने के लिए एक कम शाखा और एक कम स्थिति है।
यदि स्थिति जांचना महंगा है, और आप जानते हैं कि आपको कम से कम एक बार लूप की गारंटी है, तो एक do-whileलूप तेज हो सकता है।
और जबकि यह सबसे अच्छा में एक माइक्रो-ऑप्टिमाइज़ेशन माना जाता है, यह एक ऐसा है जो कंपाइलर हमेशा नहीं कर सकता है: विशेष रूप से जब कंपाइलर यह साबित करने में असमर्थ है कि लूप हमेशा कम से कम एक बार दर्ज करेगा।
दूसरे शब्दों में, एक समय-पाश:
while (condition){
body
}
प्रभावी रूप से इस के रूप में ही है:
if (condition){
do{
body
}while (condition);
}
यदि आप जानते हैं कि आप हमेशा कम से कम एक बार लूप करेंगे, कि अगर-स्टेटमेंट बाहरी है।
इसी तरह विधानसभा स्तर पर, यह लगभग अलग-अलग छोरों को कैसे संकलित किया जाता है:
लूप करते समय:
start:
body
test
conditional jump to start
घुमाव के दौरान:
test
conditional jump to end
start:
body
test
conditional jump to start
end:
ध्यान दें कि स्थिति को डुप्लिकेट किया गया है। एक वैकल्पिक तरीका है:
unconditional jump to end
start:
body
end:
test
conditional jump to start
... जो अतिरिक्त छलांग के लिए डुप्लिकेट कोड को हटा देता है।
किसी भी तरह से, यह अभी भी एक सामान्य do-whileलूप से भी बदतर है ।
उस ने कहा, कंपाइलर जो चाहे कर सकते हैं। और अगर वे साबित कर सकते हैं कि लूप हमेशा एक बार में प्रवेश करता है, तो यह आपके लिए काम करता है।
लेकिन सवाल में विशेष उदाहरण के लिए चीजें थोड़ी अजीब हैं क्योंकि इसमें एक खाली लूप बॉडी है। चूंकि कोई शरीर नहीं है, इसलिए whileऔर के बीच कोई तार्किक अंतर नहीं है do-while।
FWIW, मैंने इसे विज़ुअल स्टूडियो 2012 में परीक्षण किया:
खाली शरीर के साथ, यह वास्तव में whileऔर के लिए एक ही कोड उत्पन्न करता है do-while। इसलिए यह हिस्सा पुराने दिनों का अवशेष है, जब कंपाइलर उतने महान नहीं थे।
लेकिन एक गैर-खाली निकाय के साथ, वीएस २०१२ हालत कोड के दोहराव से बचने का प्रबंधन करता है, लेकिन फिर भी एक अतिरिक्त सशर्त कूद पैदा करता है।
तो यह विडंबना है कि जबकि प्रश्न में उदाहरण पर प्रकाश डाला गया है कि do-whileसामान्य मामले में एक लूप क्यों तेज हो सकता है, उदाहरण खुद को आधुनिक संकलक पर कोई लाभ नहीं देता है।
यह देखते हुए कि टिप्पणी कितनी पुरानी थी, हम केवल अनुमान लगा सकते हैं कि यह क्यों मायने रखेगा। यह बहुत संभव है कि समय पर संकलक यह पहचानने में सक्षम नहीं थे कि शरीर खाली था। (या यदि वे करते हैं, तो उन्होंने जानकारी का उपयोग नहीं किया।)