2013-09-23 15 views
6

की तुलना करें मेरे पास एक समय लूप है जिसके अंदर मैं केवल एक बार एक विशिष्ट ऑपरेशन करना चाहता हूं, और अन्य सभी लूप रनों के लिए एक अलग ऑपरेशन करना चाहता हूं। 0 साथ केवल एक बार की तुलना करनेसी/सी ++ केवल एक बार

while (..) { 
    if (0 == count) { 
     // do_this 
    } else { 
     // do_that 
    } 
    count++; 
} 

यहाँ, count जरूरतों लेकिन यह अनावश्यक रूप से प्रत्येक पाश समय में तुलना की जाती है। क्या कोई वैकल्पिक तरीका है जहां तुलना केवल एक बार होती है और एक बार सफल होने के बाद इसे फिर से नहीं कहा जाता है?

+0

क्या आप सुनिश्चित हैं कि प्रदर्शन हिट प्रासंगिक है? 'If ​​()' block _might_ के बिना कोड को फिर से लिखना तेजी से हो सकता है, लेकिन क्या डेवलपर्स के रूप में यह स्पष्ट है? –

+0

आपको इससे बहुत चिंतित नहीं होना चाहिए क्योंकि यह वास्तव में 'if' CPU की शाखा पूर्वानुमान एल्गोरिदम पूरी तरह से संभालता है। –

उत्तर

18

या तो पाश से पहले count == 0 के लिए काम करते हैं, या यदि ऐसा संभव नहीं है (क्योंकि यह अन्य चीजें हैं जो किए जा रहे हैं के बीच में है) सिर्फ अपने कोड मानव पठनीय होने के बारे में है और किसी भी आधा सभ्य संकलक इसे आपके लिए समझ जाएगा। या यह इसे समझ नहीं पाएगा और सीपीयू में शाखा भविष्यवाणी नौकरी करेगी। किसी भी तरह से एक नैनो-अनुकूलन इस तरह से कोड को पढ़ने में अधिक समय लगेगा, आप कभी भी निष्पादन समय पर सहेज लेंगे।

+3

+1 शाखा भविष्यवाणी का उल्लेख करने के लिए। लूप के पर्याप्त पुनरावृत्तियों के साथ निश्चित रूप से यह निश्चित रूप से लात होगा। और यदि ऐसा नहीं होता है, वैसे भी परेशान करने की कोई आवश्यकता नहीं है। – Angew

8
{ 
    // do_this 
} 
count = 1; /*assuming count previously started at zero*/ 
while (..) { 
    // do_that 
    count++; /*although some folk prefer ++count as it's never slower than count++*/ 
} 

बेहतर

+0

आपको अगर (...) राज्य के साथ कुछ भी करना चाहिए, अन्यथा यह वही नहीं है। – Arpegius

+0

अर्पेजिअस: वास्तव में आप करते हैं; '// यह 'ब्रेसिज़ में होना चाहिए। मैंने जवाब में संशोधन किया है। – Bathsheba

+0

धन्यवाद, यह अच्छा है। लेकिन जब मैं 'getline' के साथ थोड़ी देर लूप करता हूं तो यह साफ़ नहीं होगा। जब मैं एक फाइल पढ़ रहा हूं और केवल फाइल की पहली पंक्ति के लिए कुछ ऑपरेशन करना चाहता हूं। उस स्थिति में, आपकी योजना के साथ मुझे 'do_this' में दो बार 'getline' को कॉल करने की आवश्यकता होगी और दूसरी बार' .. (0)' – user13107

3

अनावश्यक रूप से अनुकूलित न करें!

तुलना की लागत 1-2 घड़ी चक्र है और जैसा कि कला द्वारा वर्णित है इसे संकलक द्वारा अनुकूलित किया जा सकता है। फ़ाइल से पढ़ने की लागत की तुलना में लागत बिल्कुल लापरवाह है। आपके प्रोग्राम का प्रदर्शन I/O द्वारा बाध्य होगा (या तो मेमोरी रीड या डिस्क इस पर निर्भर करता है कि फाइल मेमोरी में मैप की गई है या नहीं)।

इस मामले में आपको कोड लिखना चाहिए ताकि इसे बनाए रखना आसान हो।

+1

जबकि तुलना की लागत छोटी है, शाखा की लागत आम तौर पर काफी बड़ी होती है।निश्चित रूप से I/O के क्रम में नहीं, बल्कि कोड के प्रदर्शन-महत्वपूर्ण टुकड़े में, आप * पाइपलाइन को रोकना नहीं चाहते हैं। – Angew

+0

@Angew इस विशेष उदाहरण में शाखा की लागत किसी भी शाखा भविष्यवाणी के लिए इष्टतम मामले के करीब है जैसा आप प्राप्त कर सकते हैं। आप या तो पाइपलाइन को रोक नहीं पाएंगे या आप लूप को दो बार दोहराएंगे कि यह पूरा अनुकूलन व्यर्थ है। – Art

+0

@ आर्ट हां, आपने अपने जवाब में ऐसा कहा, और मैंने आपको इसके लिए +1 दिया। लेकिन इस जवाब में इसका उल्लेख नहीं है: ऐसा लगता है कि "अगर इसे अनुकूलित नहीं किया गया है, तो तुलना केवल 1-2 घड़ी चक्र है।" यह कहने के बिना कि यह शाखा भविष्यवाणी के लिए सुपर इष्टतम क्यों है, यह मेरे लिए खतरनाक लगता है। – Angew

संबंधित मुद्दे