2017-05-19 6 views
10

हेड्स अप: मैं इसे स्मृति से कुछ लिख रहा हूं इसलिए मेरे पास कुछ अवधारणाएं गलत हो सकती हैं।क्या कोटलिन इनलाइन जावा अज्ञात कक्षाओं से कम महंगे हैं?


जावा में एक अनाम कार्य लिखने की क्षमता है। यह तब उपयोगी होता है जब आपके पास किसी प्रकार की घटना के लिए श्रोता इंटरफ़ेस होता है। एक उदाहरण के रूप:

button.setOnClickListener(new View.OnClickListener(View v) { 
    @Override 
    public void onClick(View v) { 
     // handle the action here 
    } 
}); 

गुमनाम श्रोता एक वर्ग है कि OnClickListener$1.class की तरह कुछ कहा जाता है के रूप में संकलित किया जाएगा। यह जावा भाषा का एक अंतर्निहित डिजाइन निर्णय है। सबकुछ एक वस्तु है, यहां तक ​​कि अज्ञात कार्य भी।

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

कोटलिन फ़ंक्शंस में स्रोत कोड बिंदु दृश्य से अधिक प्रथम श्रेणी होती है। मेरा सवाल यह है कि, क्या कोटलिन इन कार्यों को बाइट कोड से गुजरता है जावा की तुलना में अधिक कुशलता से गुमनाम कक्षाओं के साथ करता है या क्या मैं जावा में बड़ी कक्षा गिनती के समान मुद्दों में भाग लेगा?

धन्यवाद,

उत्तर

9

संक्षिप्त उत्तर हाँ है, कोटलिन इनलाइन फ़ंक्शन काफी सस्ते हैं।

जब एक इनलाइन फ़ंक्शन कॉल संकलित की जाती है, कॉल को पास किए गए लैम्बडास फ़ंक्शन बॉडी में उल्लिखित होते हैं, जो बदले में कॉल साइट पर रेखांकित होता है। यह संकलक को लैम्ब्डा निकायों के लिए कोई अतिरिक्त कक्षाएं या विधियां उत्पन्न करने की अनुमति नहीं देता है।

Compilation of an inline function

the slides Kotlin के बारे में से एक @yole द्वारा संकलन निर्माण करती है। दुर्भाग्यवश, मुझे रिकॉर्ड केवल in Russian मिला। अन्य स्लाइड्स कुछ हितों के भी हैं, आप वहां गैर-इनलाइन लैम्बडा के बारे में अधिक जानकारी प्राप्त कर सकते हैं।

आम तौर पर, लैंबडास के साथ इनलाइन फ़ंक्शंस का उपयोग करने वाले कोटलिन कोड लैम्बडा या स्ट्रीम के साथ समान जावा कोड से तेज़ी से काम करता है। सभी कोड बाध्यकारी संकलन-समय पर किया जाता है, और वर्चुअल विधि कॉल का कोई रनटाइम ओवरहेड नहीं होता है, न ही एंड्रॉइड के लिए महत्वपूर्ण विधियों की संख्या बढ़ जाती है।

अत्यधिक इनलाइनिंग का नकारात्मक हिस्सा कोड आकार वृद्धि है: इनलाइन फ़ंक्शन बॉडी के बाइटकोड का सामान्य भाग कॉल साइटों पर वास्तव में डुप्लिकेट हो जाता है। साथ ही, इनलाइनिंग को डिबगिंग को जटिल बनाना, क्योंकि कोड की लाइन संख्या और कॉल स्टैक स्रोत फ़ाइल में जो कुछ था उससे भिन्न होगा। हालांकि आईडीई समर्थन यहां मदद कर सकता है।

मैं आपको इनलाइन फ़ंक्शंस के साथ प्रयोग करने की सलाह दूंगा: आप आसानी से inspect the resulting bytecode कर सकते हैं; और, ज़ाहिर है, अपने विशेष उपयोग मामलों के कुछ बेंचमार्किंग करें जहां प्रदर्शन मायने रखता है।

+0

अरे, मैं गहराई से प्रतिक्रिया के लिए धन्यवाद कहना चाहता था। यही वह है जिसकी तलाश में मैं हूं। – Brad

+0

@ ब्रैड आपका स्वागत है, खुशी है कि मैं मदद कर सकता हूं। – hotkey

+0

धन्यवाद सर, मुझे मिल गया। –

1

Kotlin एक inline कीवर्ड है। यदि आप इस कीवर्ड का उपयोग करते हैं, न केवल यह फ़ंक्शन को रेखांकित करता है बल्कि आप लैम्ब्डा बॉडी का इलाज कर सकते हैं जैसे कि यह केवल घोंसला वाला स्कोप स्तर था, ताकि आप इससे return कर सकें!

उदाहरण (सीधे डॉक्स से)

fun foo() { 
    inlineFunction { 
     return // OK: the lambda is inlined 
    } 
} 

बाहर की जाँच करें और अधिक के लिए डॉक्स:

https://kotlinlang.org/docs/reference/inline-functions.html

संपादित करें:

प्रदर्शन के बारे में अपने सटीक प्रश्न को स्पष्ट करने के लिए, यह है दस्तावेज़ों का पहला अनुच्छेद:

उच्च-आदेश कार्यों का उपयोग कुछ रनटाइम दंड लगाता है: प्रत्येक कार्य एक वस्तु है, और यह बंद हो जाता है, यानी वे चर जो फ़ंक्शन के शरीर में उपयोग किए जाते हैं। मेमोरी आवंटन (फ़ंक्शन ऑब्जेक्ट्स और क्लासेस दोनों के लिए) और आभासी कॉल रनटाइम ओवरहेड पेश करते हैं।

लेकिन ऐसा लगता है कि कई मामलों में लैम्ब्डा अभिव्यक्तियों को रेखांकित करके इस तरह के ओवरहेड को समाप्त किया जा सकता है।

तो जहां तक ​​मैं हाँ बता सकता हूं, यह फ़ंक्शन को रेखांकित करेगा और किसी भी ओवरहेड को हटा देगा जो अन्यथा लगाया जाएगा।

हालांकि, ऐसा लगता है कि आप केवल उन कार्यों पर लागू होते हैं जिन्हें आप inline घोषित करते हैं।

+0

यह वास्तव में मैं नहीं पूछ रहा था, लेकिन धन्यवाद। यदि आप उच्च ऑर्डर फ़ंक्शन में इनलाइन फ़ंक्शन पास करते हैं जो संकलित बाइट कोड हां में कई फ़ंक्शन बनाएगा? – Brad

+0

@Brad ने आपकी चिंता का जवाब देने के लिए उत्तर संपादित किया – hasen

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