2010-03-28 20 views
9

क्या सी ++ या "g ++ -fast" टैग में "इनलाइनिंग" की लगातार विधियों के साथ तेजी से निष्पादन के लिए उद्देश्य-सी के लिए मानक अनुकूलन चालें हैं?उद्देश्य-सी अनुकूलन

संपादित करें: क्या किसी के पास एसईएल और आईएमपी का उपयोग करके एक छोटा सा उदाहरण है जब मोड में इनपुट के लिए दो (या अधिक) पूर्णांक होते हैं?

+0

इस विषय को यहाँ महान विस्तार से चर्चा की है: http://www.mulle-kybernetik.com/artikel/Optimization/ – codewarrior

+1

कोको की तरह एक उच्च स्तरीय ढांचे में, इस तरह सबसे छोटे अनुकूलन समय की बर्बादी कर रहे हैं (कंपाइलर सेटिंग्स बदलने के अलावा), चूंकि बहुत से आधारभूत वर्ग पहले से ही अनुकूलित हैं। आपको केवल ऑप्टिमाइज़ करना चाहिए यदि प्रोफाइलिंग से पता चलता है कि कुछ अतिरिक्त समय ले रहा है। – shosti

उत्तर

12

यहां एक छोटा सा अनुकूलन है जो वास्तव में लागू करने के समय के लायक नहीं हो सकता है, और एक जिसे मैंने कभी व्यक्तिगत रूप से उपयोग नहीं किया है, लेकिन मुझे लगता है कि अभी भी यह जानना अच्छा है। एक ही ऑब्जेक्ट को बार-बार उसी संदेश पर भेजने की बजाय, आप विधि कार्यान्वयन का उपयोग करके बार-बार विधि प्रेषण को बाईपास कर सकते हैं। उदाहरण के लिए, के बजाय के लिए:

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 बन जाता है।

यदि आप सही “ फ़ंक्शन परिभाषा ” (मुझे उचित अवधि याद नहीं है) का उपयोग नहीं करते हैं तो यह दृष्टिकोण तेजी से खट्टा हो सकता है। IMPtypedef एक फ़ंक्शन के लिए 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 बचा सकता है और आप एक विशेष वर्ग की सभी आवृत्तियों के लिए उपयोग करने में सक्षम हो सकता है, सिर्फ एक उदाहरण नहीं, लेकिन ध्यान से चलना।

+6

अधिकांश प्रदर्शन वस्तुओं के साथ, आपको यह देखने के लिए अपने कोड पर उपकरण चलाएंगे कि बाधाएं कहां हैं। उपरोक्त आइटम बहुत अच्छे हैं ... यदि आपको उनकी आवश्यकता है। यदि आप नहीं करते हैं, तो यह कोड को पढ़ने में कठोर बनाता है। – nall

+2

@ नहीं: बिल्कुल। मैंने कुछ बुनियादी बेंचमार्किंग की, और उपरोक्त की तरह तंग लूपों में, प्रेषण को छोड़कर निष्पादन समय के लगभग आधा परिणाम ('विधि विधि' ने कुछ मूल गणित किए)। यदि 'objc_msgSend' (या जो भी विधि इन दिनों कहा जाता है) में बहुत समय बिताया जाता है, तो प्रेषण को छोड़कर एक विकल्प हो सकता है, अन्यथा, जैसा कि आप कहते हैं, यह अनुकूलन से अधिक obfuscation होगा। – dreamlax

+0

यह वास्तव में एक दिलचस्प अनुकूलन है, लेकिन आईएमपी को किसी विधि से प्राप्त करने के बजाय केवल सी फ़ंक्शन बनाना आसान नहीं होगा? – shosti

9

अनुकूलन सबसे अच्छा संकलक द्वारा संभाला जाता है। मैक जीसीसी का उपयोग करते हैं, इसलिए मानक अनुकूलन जीसीसी ध्वज (-ओ स्तर) काम करना चाहिए। एक्सकोड में, आप project settings में अनुकूलन स्तर सेट कर सकते हैं। यदि आप जीसीसी का उपयोग नहीं कर रहे हैं, तो ऑप्टिमाइज़ेशन को सक्षम करने के तरीके के लिए आपको कंपाइलर दस्तावेज़ देखें।

अद्यतन: एक्सकोड 4 डिफ़ॉल्ट रूप से LLVM बैकएंड का उपयोग करता है। जीसीसी और क्लैंग फ्रंटेंड दोनों "-O एन" ऑप्टिमाइज़ेशन झंडे का उपयोग करते हैं। जीसीसी के लिए, एन 0 से 3, या "एस" या (केवल ऐप्पल) "z" से एक पूर्णांक है। क्लैंग के लिए, एन 0 से 4, या "एस" से एक पूर्णांक है।

+0

यह सही है - ऑफ मेमोरी यह सेट है [-O3] – SK9

+0

आपके सुझाव और समय के लिए बहुत धन्यवाद! यदि आप इच्छुक हैं, तो क्या आप एसईएल और आईएमपी का उपयोग करके एक छोटा सा उदाहरण दे सकते हैं जब विधि दो इनपुट (या अधिक) पूर्णांक को इसके इनपुट के रूप में लेती है। – SK9

+0

@SpecialK: * क्या * का एक संक्षिप्त उदाहरण? क्या आपको सपनों के जवाब पर टिप्पणी करने का मतलब था? – outis

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