यहां एक छोटा सा अनुकूलन है जो वास्तव में लागू करने के समय के लायक नहीं हो सकता है, और एक जिसे मैंने कभी व्यक्तिगत रूप से उपयोग नहीं किया है, लेकिन मुझे लगता है कि अभी भी यह जानना अच्छा है। एक ही ऑब्जेक्ट को बार-बार उसी संदेश पर भेजने की बजाय, आप विधि कार्यान्वयन का उपयोग करके बार-बार विधि प्रेषण को बाईपास कर सकते हैं। उदाहरण के लिए, के बजाय के लिए:
for (int i = 0; i < 100000000; i++)
[someObject messageWithInt:i];
आप की कोशिश कर सकते:
SEL theSelector = @selector(messageWithInt:);
IMP theMethod = [someObject methodForSelector:theSelector];
for (int i = 0; i < 100000000; i++)
theMethod (someObject, theSelector, i);
इसका मतलब है कि विधि देखने केवल एक बार किया जाता है और आप वापस आ IMP
मूल्य के माध्यम से सीधे विधि आह्वान कर सकते हैं। सभी उद्देश्य-सी विधि कार्यान्वयन में कम से कम दो तर्क होते हैं, पहला तर्क id
प्रकार प्राप्त करने वाली वस्तु है, जो विधि कार्यान्वयन के भीतर self
बन जाता है, और दूसरा तर्क चयनकर्ता [प्रकार SEL
] है जिसका उपयोग विधि निर्धारित करने के लिए किया गया था कार्यान्वयन, और विधि कार्यान्वयन में _cmd
बन जाता है।
यदि आप सही “ फ़ंक्शन परिभाषा ” (मुझे उचित अवधि याद नहीं है) का उपयोग नहीं करते हैं तो यह दृष्टिकोण तेजी से खट्टा हो सकता है। IMP
typedef
एक फ़ंक्शन के लिए void*
देता है और तर्क के रूप में (id,SEL,...)
लेता है। यह विधि का उपयोग करने में परेशानी कर सकती है यदि विधि वास्तव में float
जैसी कुछ और लौटाती है। इस मामले के साथ मदद करने के लिए आप वापसी मान -methodForSelector:
की इस तरह डाल सकता,: कुछ देखभाल के साथ
typedef float (*MyMethodIMP)(id,SEL,int);
SEL theSel = @selector(messageWithInt:);
MyMethodIMP theMethod = (MyMethodIMP)[someObject methodForSelector:theSel];
float result = 0.0;
for (int i = 0; i < 100000000; i++)
result += theMethod (someObject, theSel, i);
, आप theMethod
बचा सकता है और आप एक विशेष वर्ग की सभी आवृत्तियों के लिए उपयोग करने में सक्षम हो सकता है, सिर्फ एक उदाहरण नहीं, लेकिन ध्यान से चलना।
इस विषय को यहाँ महान विस्तार से चर्चा की है: http://www.mulle-kybernetik.com/artikel/Optimization/ – codewarrior
कोको की तरह एक उच्च स्तरीय ढांचे में, इस तरह सबसे छोटे अनुकूलन समय की बर्बादी कर रहे हैं (कंपाइलर सेटिंग्स बदलने के अलावा), चूंकि बहुत से आधारभूत वर्ग पहले से ही अनुकूलित हैं। आपको केवल ऑप्टिमाइज़ करना चाहिए यदि प्रोफाइलिंग से पता चलता है कि कुछ अतिरिक्त समय ले रहा है। – shosti