2011-11-19 7 views
13
  1. क्या एलएलवीएम स्वचालित रूप से ऑब्जेक्टिव-सी विधियों को इनलाइन फ़ंक्शंस में परिवर्तित करने के लिए परिवर्तित करता है?क्या एलएलवीएम उद्देश्यों-सी तरीकों को इनलाइन कार्यों में परिवर्तित करता है?

    (यानी, वह कोड का एक खंड है कि आप अन्यथा इनलाइन पेस्ट कर सकता है के लिए एक ऑब्जेक्टिव-सी विधि बनाने के लिए? बस के रूप में performant है)

  2. LLVM इस अनुकूलन प्रदर्शन नहीं करता है, तो क्यों नहीं? अगर ऐसा होता है, (ए) क्या कुछ बिल्ड सेटिंग्स हैं जो मुझे होने के लिए सेट करनी चाहिए? (बी) मैं कैसे बता सकता हूं कि कोई उद्देश्य-सी विधि रेखांकित की जाएगी?

उत्तर

12

नहीं, क्योंकि ओब्जे-सी रनटाइम के संदर्भ में यह असंभव है कि उन तरह के अनुकूलन किए जा सकते हैं। याद रखने की बात यह है कि संदेश भेजने से ओब्जे-सी विधियों को बुलाया जाता है, ये संदेश केवल [myObject doSomething] वाक्यविन्यास से अधिक हो सकते हैं।

[obj performSelector:NSSelectorFromString(@"hello")] पर विचार करें कि इसका मतलब यह हो सकता है कि किसी भी विधि को इनलाइन करना असंभव होगा।

ऐसी घटनाओं की एक श्रृंखला भी होती है जो कक्षा द्वारा एक संदेश प्राप्त होने पर होता है, ये घटनाएं फिर से भेजे जा सकने वाले संदेश को फिर से बदल सकती हैं या बदल सकती हैं। यह संदेश भेजने के नीचे पारदर्शी रूप से होता है।

+0

क्यों एलएलवीएम नियमित कॉल को प्रतिस्थापित नहीं कर सकता है, उदाहरण के लिए, '[obj x]; obj.x' और 'performSelector' कॉल, उदा।, '[obj प्रदर्शन चयनकर्ता: x_sel]', आदि, 'x' के विधि निकाय के साथ? और, यह निर्धारित करने के लिए कि क्या इनलाइन होना चाहिए, यह निर्धारित करने के लिए 'आगेInvocation:' जैसी विधियों के कार्यान्वयन की जांच क्यों नहीं कर सकता? चलो एलएलवीएम, चतुर बनो! :) – ma11hew28

+7

क्योंकि उन्हें रनटाइम पर तीन बार बदल दिया जा सकता है। मैं किसी भी विधि के implenentafion को रनटाइम कोड की 3 या 4 पंक्तियों में बदल सकता हूं। –

9

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

इस वजह से, ओब्जे-सी में एक संदेश प्रेषण हमेशा शुद्ध फ़ंक्शन कॉल से थोड़ा धीमा होगा (भले ही फ़ंक्शन इनलाइन नहीं है)। , सही

- (void)doBar { 
    [self doAwesomeStuff]; 
    { 
    NSLog(@"doing foo!"); 
    } 
} 

बहुत बढ़िया, कि यह की तरह लगता है था तेजी से हो:

@implementation AwesomeClass 

- (void)doFoo OBJC_INLINE { // or some way to indicate "this is an inline method" 
    NSLog(@"doing foo!"); 
} 

- (void)doBar { 
    [self doAwesomeStuff]; 
    [self doFoo]; 
} 

@end 

ताकि -doBar अनिवार्य रूप से हो जाता है:

9

के एक पल संकलक एक विधि inlines कि के लिए मान लेते हैं? objc_msgSend पर कॉल करके हम खुद को एक पूरे दर्जन निर्देशों को बचाते हैं। तो आप इसे पैकेज करते हैं और इसे एए फ़ाइल के रूप में ऑनलाइन पोस्ट करते हैं।

NSCleverCoder साथ आता है और कहते हैं, "लेकिन मैं doFoo चाहते थोड़ा और अधिक करने के लिए", तो वह करता है:

@interface SuperAwesomeClass : AwesomeClass @end 
@implementation SuperAwesomeClass 
- (void)doFoo { 
    NSLog(@"doing more foo!"); 
    [super doFoo]; 
} 
@end 

जब वह इस चलाने के लिए कोशिश करता है, यह कभी नहीं बुलाया जाता है, क्योंकि कभी नहीं AwesomeClass वास्तव में -doFoo विधि का आह्वान करता है।

"लेकिन," आप कहते हैं, "यह एक प्रत्याशित उदाहरण है!"

नहीं, ऐसा नहीं है। उद्देश्य-सी में, किसी ऐप के विकास या निष्पादन में किसी भी समय यह करने के लिए पूरी तरह से कानूनी है। मैं कोड लिखते समय ऐसा कर सकता हूं। बिल्ली, मैं objc_allocateClassPair और class_addMethod का उपयोग करके गतिशील रूप से उप-वर्ग बनाने और विधि ओवरराइड जोड़ने के द्वारा रनटाइम पर भी ऐसा कर सकता हूं।

मैं विधि कार्यान्वयन को भी तेज कर सकता हूं।-doFoo के मौजूदा कार्यान्वयन को पसंद नहीं है? यह अच्छा है; अपनी स्वयं की वस्तु से इसे प्रतिस्थापित करें। अरे रुको; यदि विधि को रेखांकित किया गया था, तो आपका नया कार्यान्वयन कभी भी नहीं बुलाया जाएगा, क्योंकि -doBar वास्तव में -doFoo विधि का आविष्कार नहीं कर रहा है।

केवल समय मैं यह संभव देख सकता था कि अगर किसी विधि को गैर-अतिसंवेदनशील होने के तरीके को एनोटेट करने का कोई तरीका है। But there's no way to do that, ताकि समस्या हल हो। और तब भी, यह अभी भी एक बुरा विचार होगा; सिर्फ इसलिए कि संकलक आपको ऐसा करने नहीं देता है इसका मतलब यह नहीं है कि आप अभी भी रनटाइम पर इसके आसपास काम नहीं कर सकते हैं। और फिर, आप समस्याओं में भाग लेंगे।

+0

मुझे लगता है कि मैं बस सोच रहा था कि कंपाइलर ऐसे मामलों का पता लगा सकता है जहां विधि को ओवरराइड विधि के भीतर बुलाया जा रहा है और इसे ओवरराइडिंग विधि में भी डाला जा सकता है ... लेकिन, मैं देख सकता हूं कि कंपाइलर को कितना आसान स्मार्ट होना चाहिए वो करें। फिर भी ... एआरसी बहुत अद्भुत है ... हो सकता है कि वे एलएलवीएम में एक और अच्छी सुविधा जोड़ सकें जो जानता है कि तरीकों को इनलाइन कैसे करें। – ma11hew28

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