क्या एलएलवीएम स्वचालित रूप से ऑब्जेक्टिव-सी विधियों को इनलाइन फ़ंक्शंस में परिवर्तित करने के लिए परिवर्तित करता है?क्या एलएलवीएम उद्देश्यों-सी तरीकों को इनलाइन कार्यों में परिवर्तित करता है?
(यानी, वह कोड का एक खंड है कि आप अन्यथा इनलाइन पेस्ट कर सकता है के लिए एक ऑब्जेक्टिव-सी विधि बनाने के लिए? बस के रूप में performant है)
LLVM इस अनुकूलन प्रदर्शन नहीं करता है, तो क्यों नहीं? अगर ऐसा होता है, (ए) क्या कुछ बिल्ड सेटिंग्स हैं जो मुझे होने के लिए सेट करनी चाहिए? (बी) मैं कैसे बता सकता हूं कि कोई उद्देश्य-सी विधि रेखांकित की जाएगी?
उत्तर
नहीं, क्योंकि ओब्जे-सी रनटाइम के संदर्भ में यह असंभव है कि उन तरह के अनुकूलन किए जा सकते हैं। याद रखने की बात यह है कि संदेश भेजने से ओब्जे-सी विधियों को बुलाया जाता है, ये संदेश केवल [myObject doSomething]
वाक्यविन्यास से अधिक हो सकते हैं।
[obj performSelector:NSSelectorFromString(@"hello")]
पर विचार करें कि इसका मतलब यह हो सकता है कि किसी भी विधि को इनलाइन करना असंभव होगा।
ऐसी घटनाओं की एक श्रृंखला भी होती है जो कक्षा द्वारा एक संदेश प्राप्त होने पर होता है, ये घटनाएं फिर से भेजे जा सकने वाले संदेश को फिर से बदल सकती हैं या बदल सकती हैं। यह संदेश भेजने के नीचे पारदर्शी रूप से होता है।
नहीं। ऐसा नहीं है कि संदेश प्रेषण ऑब्जेक्टिव-सी का एक अनिवार्य विशेषता (याद रखें कि 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
अनिवार्य रूप से हो जाता है:
के एक पल संकलक एक विधि 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, ताकि समस्या हल हो। और तब भी, यह अभी भी एक बुरा विचार होगा; सिर्फ इसलिए कि संकलक आपको ऐसा करने नहीं देता है इसका मतलब यह नहीं है कि आप अभी भी रनटाइम पर इसके आसपास काम नहीं कर सकते हैं। और फिर, आप समस्याओं में भाग लेंगे।
मुझे लगता है कि मैं बस सोच रहा था कि कंपाइलर ऐसे मामलों का पता लगा सकता है जहां विधि को ओवरराइड विधि के भीतर बुलाया जा रहा है और इसे ओवरराइडिंग विधि में भी डाला जा सकता है ... लेकिन, मैं देख सकता हूं कि कंपाइलर को कितना आसान स्मार्ट होना चाहिए वो करें। फिर भी ... एआरसी बहुत अद्भुत है ... हो सकता है कि वे एलएलवीएम में एक और अच्छी सुविधा जोड़ सकें जो जानता है कि तरीकों को इनलाइन कैसे करें। – ma11hew28
- 1. एलएलवीएम इनलाइन को लाइब्रेरी
- 2. क्या संकलक तय करता है कि मेरे कार्यों को इनलाइन करने के लिए कब (सी ++ में)?
- 3. एलएलवीएम समर्थन क्या एआरएम आर्किटेक्चर करता है?
- 4. रूबी कार्यों तरीकों
- 5. एलएलवीएम जेआईटी गति को तेज करता है?
- 6. बाहरी सी ++ कार्यों में एलएलवीएम जेआईटी कोड को जोड़ने
- 7. एलएलवीएम संदर्भ क्या है?
- 8. एलएलवीएम
- 9. क्या फ़ंक्शन इनलाइन बनाना इसके संबंध को प्रभावित करता है?
- 10. एलएलवीएम इंटरमीडिएट प्रतिनिधित्व क्या है?
- 11. एलएलवीएम कौन सा अनुकूलन करता है?
- 12. सी - एलएलवीएम की तुलना कैसे करता है?
- 13. सी # इनलाइन गुण करता है?
- 14. एलएलवीएम
- 15. वास्तव में कौन सी धारावाहिक तरीकों को लागू करता है?
- 16. एलएलवीएम
- 17. क्या जेआईटी कंपाइलर अनावश्यक परिवर्तनीय घोषणाओं को इनलाइन (इनलाइन) अनुकूलित करता है?
- 18. जीसीसी आईआर को एलएलवीएम आईआर
- 19. क्या preg पीएचपी के कार्यों में लिए खड़े करता है?
- 20. क्या जावास्क्रिप्ट को इनलाइन
- 21. एलएलवीएम जेआईटी कोड को स्टेटिक एलएलवीएम पुस्तकालयों से जोड़ना?
- 22. एलएलवीएम
- 23. आरसीपीपी + इनलाइन - अतिरिक्त कार्यों को बनाने और कॉल करने
- 24. एक जीसीसी इनलाइन कोडांतरक परिवर्तित इनलाइन कोडांतरक डेल्फी
- 25. एलएलवीएम
- 26. "इनलाइन थ्रेड" क्या है?
- 27. एलएलवीएम
- 28. एलएलवीएम
- 29. छवि का उपयोग क्यों करता है: इनलाइन लेकिन इनलाइन-ब्लॉक तत्व की तरह व्यवहार करता है
- 30. एलएलवीएम
क्यों एलएलवीएम नियमित कॉल को प्रतिस्थापित नहीं कर सकता है, उदाहरण के लिए, '[obj x]; obj.x' और 'performSelector' कॉल, उदा।, '[obj प्रदर्शन चयनकर्ता: x_sel]', आदि, 'x' के विधि निकाय के साथ? और, यह निर्धारित करने के लिए कि क्या इनलाइन होना चाहिए, यह निर्धारित करने के लिए 'आगेInvocation:' जैसी विधियों के कार्यान्वयन की जांच क्यों नहीं कर सकता? चलो एलएलवीएम, चतुर बनो! :) – ma11hew28
क्योंकि उन्हें रनटाइम पर तीन बार बदल दिया जा सकता है। मैं किसी भी विधि के implenentafion को रनटाइम कोड की 3 या 4 पंक्तियों में बदल सकता हूं। –