- आपको वास्तव में इसे स्वयं जांचना होगा। मेरा अनुमान है कि उत्सर्जित कोड में एक अंतर है, लेकिन यह संकलक और कंपाइलर विकल्पों पर निर्भर हो सकता है, और यह निश्चित रूप से
array
की परिभाषा पर निर्भर हो सकता है।
- लगभगका मूल्यांकन करने वाली धारणा पर लगभग "कुछ काम" की तुलना में लगभग हमेशा महत्वहीन नहीं है। इसे मापने का तरीका, हालांकि, एक प्रोफाइलर (या समतुल्य) का उपयोग करना है और देखें कि कोड की उस पंक्ति पर आपके प्रोग्राम के रनटाइम का अनुपात कितना खर्च किया जाता है। बशर्ते प्रोफाइलर सटीक है, यह है आप इसे बदलकर हासिल करने की उम्मीद कर सकते हैं।
मान लीजिए array.count
कुछ वास्तव में धीमा है, तो आपको पता चल जाएगा कि हमेशा एक ही परिणाम वापस आ जाएगा लेकिन संकलक इसे नहीं जानता है। तो यह मैन्युअल रूप से इसे उभारा लायक हो सकता है। strlen
एक उदाहरण के रूप में उपयोग किया जाता है। यह बहस का मुद्दा है कि कितनी बार strlen
व्यवहार में वास्तव में धीमी है, लेकिन धीमी गति से वे की जरूरत को चलाने की संभावना उदाहरण निर्माण करने के लिए आसान है:
char some_function(char a) {
return (a * 2 + 1) & 0x3F;
}
for (int i = 0; i < strlen(ptr); ++i) {
ptr[i] = some_function(ptr[i]); // faster than strlen for long enough strings.
}
आप और मुझे पता है कि some_function
कभी नहीं देता है 0, और इसलिए की लंबाई स्ट्रिंग कभी नहीं बदलती है। कंपाइलर को some_function
की परिभाषा दिखाई नहीं दे सकती है, और यहां तक कि यदि यह देखता है कि परिभाषा को यह नहीं पता हो सकता है कि इसकी गैर-शून्य-वापसी महत्वपूर्ण है।
स्रोत
2012-10-10 10:30:13
अक्सर इसकी आवश्यकता नहीं होती है क्योंकि संकलक वैसे भी ऑप्टिमाइज़ेशन कर सकता है। लेकिन सुनिश्चित करने का एकमात्र तरीका दोनों तरीकों और माप का परीक्षण करना है। परिणामी मशीन कोड के लिए, आप आसानी से स्वयं को जांच सकते हैं, दोनों क्लैंग और जीसीसी के पास असेंबलर फ़ाइलों को आउटपुट करने के लिए झंडे हैं, और यदि आप कुछ और नहीं तो निष्पादन योग्य को हमेशा विभाजित कर सकते हैं। –
इस मामले में, किसी ऑब्जेक्ट को भेजा गया एक संदेश है, मुझे संदेह है कि संकलक इसमें हस्तक्षेप करता है, इसलिए मेरा अनुमान होगा कि प्रत्येक पुनरावृत्ति पर 'गिनती' विधि को बुलाया जाएगा। हालांकि, यह शायद एक बहुत सस्ता कॉल है। इस विशेष मामले में सबसे अच्छा तरीका सरणी पर तेज गणना का उपयोग करना होगा। – Guillaume
"सरणी अपरिवर्तनीय है और array.count बदलता नहीं है" - मुझे उद्देश्य-सी नहीं पता, चाहे "अपरिवर्तनीय" एक ऐसी संपत्ति है जिसे संकलक समझता है, लेकिन अनुकूलन उद्देश्यों के लिए इससे कोई फर्क नहीं पड़ता कि ' array.count' परिवर्तन, यह महत्वपूर्ण है कि संकलक स्वयं को साबित कर सकता है कि 'array.count' नहीं बदलेगा। –