2009-05-25 15 views
5

में संदेश प्रेषण की लागत मैं विभिन्न परिस्थितियों में उद्देश्य-सी में संदेश प्रेषण की लागत के बारे में जानना चाहता हूं। विशेष रूप से मैं प्रोग्राम डिज़ाइन की अपनी पसंद का मार्गदर्शन करना चाहता हूं, इसलिए जब मैं एक बेहतर डिज़ाइन के लिए संदेश प्रेषण से बचकर समय-समय पर ऑप्टिमाइज़ करने का लुत्फ उठाता हूं। offsetX और offsetY:उद्देश्य-सी

मेरे वर्तमान परियोजना में एक मामला है कि मैं उदाहरण चर के साथ एक वर्ग है। मैं अक्सर पूर्ण ऑफसेट चाहते हैं और इस समय मैं हर जगह कोड की इस पंक्ति है: -

int absOffset = ((offsetX < 0.0) ? -offsetX : offsetX) + 
       ((offsetY < 0.0) ? -offsetY : offsetY); 

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

उद्देश्य-सी होगी: -

-(int)absOffset { 
    return ((offsetX < 0.0) ? -offsetX : offsetX) + 
      ((offsetY < 0.0) ? -offsetY : offsetY); 
} 

और मैं इसे इतना की तरह कहेंगे: - अब

int ao = [self absOffset]; 

, संकलक कि इनलाइन करने में सक्षम है? मुझे लगता है कि यह कम से कम इसे सीधे फ़ंक्शन कॉल पर ठीक करने में सक्षम है और गतिशील संदेश प्रेषण से बचने में सक्षम है (मुझे लगता है) उद्देश्य-सी को इसके प्रकार की प्रणाली के कारण उपयोग करना चाहिए।

इसके अलावा, सामान्य रूप में, कितना करता उद्देश्य-सी में संदेश प्रेषण लागत? एक कंक्रीट वर्ग के लिए एक सूचक बनाम 'आईडी' के माध्यम से कॉल करते समय यह अलग होता है?

उत्तर

14

Objective C messages are very fast. गति सी ++ आभासी विधि कॉल के बराबर है, हालांकि नहीं काफी के रूप में तेजी से। संदेश पास करने से बचें निश्चित रूप से समयपूर्व अनुकूलन है। हो सकता है कि आप इसे आंतरिक लूप में बहुत कुछ नहीं करना चाहें, लेकिन आपके द्वारा चुने गए एल्गोरिदम और अन्य कारकों के आपके कोड कितनी तेज़ हैं इस पर एक बड़ा कारक होगा। यदि यह बहुत धीमा है, तो एक प्रोफाइलर का उपयोग करें और वहां से जाएं।

+6

+1। यह ध्यान देने योग्य है कि संदेश कोड सभी उच्च-अनुकूलित असेंबली कोड में लिखा गया है, जो यहां स्थित है: http://opensource.apple.com/source/objc4/objc4-371.2/runtime/Messengers.subproj/ –

+1

I ' मैं ओपे लागत के लिए माइक एश की संख्या में अपने सिर खरोंच कर रहा हूँ। मैंने सी ++ वर्चुअल कॉल ओवरहेड का एक समान माप चलाया, और 3.3 गीगाहर्ट्ज प्रोसेसर पर प्रत्येक आभासी अप्रत्यक्ष के लिए जो समय मिला, वह उसके 1. – Crashworks

+4

की तुलना में 7ns की तरह था। पोस्ट किए गए लिंक के अनुसार वर्चुअल फ़ंक्शन कॉल 1.1ns लेता है जबकि एक उद्देश्य- सी प्रेषण 4 लेता है।9ns - जो लगभग 5x धीमी है। जैसे ही प्रेषक को बताया जाता है कि अभी भी सही परिस्थितियों में काफी हिट हो सकती है। मैं निश्चित रूप से समयपूर्व अनुकूलन से बचने के बारे में सहमत हूँ! – fbrereto

5

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

इसके बाद, संकलक दूर एक विधि कॉल अनुकूलित नहीं कर सकते। यह एक गतिशील भाषा है, कॉल रनटाइम तक हल नहीं किया जाता है। विभिन्न उद्देश्य-सी तकनीकें ऐसा करने के लिए कंपाइलर के किसी भी प्रयास को हरा सकती हैं।

वहाँ बनाम एक टाइप किया सूचक एक "आईडी" पर एक विधि बुला के बीच कार्यावधि में कोई अंतर नहीं है - वे ठीक उसी तंत्र के माध्यम से जाना।

अंत में, यदि आप आप को मापने से पहले प्रदर्शन विशेषताओं के बारे में सोच रहे हैं पहले से ही समय से पहले ही अनुकूलित कर रहे हैं। यह कहना नहीं है कि कभी उचित नहीं है, क्योंकि कुछ आपको विश्वास करते हैं, लेकिन यह आमतौर पर सच रहता है। इस मामले में, मुझे लगता है, अगर आप पहले डिज़ाइन डालते हैं तो आप शायद एक सभ्य पर्याप्त प्रदर्शन प्रोफ़ाइल के साथ समाप्त हो जाएंगे। आवश्यकतानुसार बाद में मापें और अनुकूलित करें।

+0

क्या आप उद्देश्य-सी में मैसेजिंग तंत्र (गतिशील प्रेषण) की लागत को कम करने के लिए कुछ तकनीकों को संबोधित कर सकते हैं? – Eonil

+1

इसकी लागत कम करने के लिए आप वास्तव में बहुत कुछ नहीं कर सकते हैं, प्रति से। यह एक निश्चित तंत्र है, और यह पहले से ही बहुत अच्छी तरह अनुकूलित है। चीजों को ध्यान में रखना है, जैसे - जब सी हेल्पर फ़ंक्शंस अधिक उपयुक्त हैं (ऊपर दिए गए मेरे पोस्ट के अनुसार), मुक्केबाजी से बचने और जहां आप कर सकते हैं, और केवल सामान्य सामान्य डिज़ाइन सिद्धांतों के तरीकों का उपयोग नहीं कर रहे हैं। अगर संदेश पास करने की लागत वास्तव में एक बाधा है (संकेत यह बहुत ही कम है), तो शायद ओबीजे-सी सही उपकरण नहीं है। उदाहरण के लिए, आप आसानी से उद्देश्य-सी (उद्देश्य-सी ++) के साथ सी ++ मिश्रण कर सकते हैं। – philsquared

+0

+1 "समझदार व्यवहार के बजाय सुविधा के तरीकों का उपयोग करने के लिए खराब डिजाइन का संकेत हो सकता है। प्रदर्शन अभी तक इसमें भी नहीं आया है।" ठीक ठीक! –