2011-01-04 16 views
38

मेरा मानना ​​है कि मैं इनलाइन फ़ंक्शंस की मूल बातें समझता हूं: फ़ंक्शन कॉल के बजाए स्टैक्स पर रखे गए पैरामीटर और एक आवेषण ऑपरेशन होता है, फ़ंक्शन की परिभाषा संकलन समय पर कॉपी की जाती है जहां आमंत्रण किया गया था, रनटाइम पर आमंत्रण ओवरहेड।मुझे स्कैला की @inline एनोटेशन का उपयोग कब करना चाहिए (और मुझे नहीं चाहिए)?

  • scalac स्मार्ट के उपयोग व्याख्याओं से होने वाले संकेत के बिना कुछ कार्यों (उदाहरण के लिए निजी डीईएफ़) इनलाइन करने के लिए करता है:

    तो मैं जानना चाहता हूँ?

  • मैं कैसे निर्णय ले सकता हूं कि स्केलैक को संकेत देने के लिए यह एक अच्छा विचार कब है कि यह एक फ़ंक्शन को रेखांकित करता है?

  • क्या कोई भी ऐसे कार्यों या आमंत्रणों के उदाहरण साझा कर सकता है जिन्हें इनलाइन किया जाना चाहिए या नहीं?

+5

इससे मदद मिल सकती है: http://stackoverflow.com/questions/2709095/does-the-inline-annotation-in-scala-really-help-performance – Arjan

उत्तर

32

कभी @inline कुछ भी जिसका कार्यान्वयन यथोचित बदल सकता है और जो एक सार्वजनिक एक पुस्तकालय का हिस्सा बनने जा रहा है।

जब मैं कहता हूं "कार्यान्वयन परिवर्तन" मेरा मतलब है कि तर्क वास्तव में बदल सकता है। उदाहरण के लिए:

object TradeComparator extends java.lang.Comparator[Trade] { 
    @inline def compare(t1 : Trade, t2 : Trade) Int = t1.time compare t2.time 
} 

मान लें कि "प्राकृतिक तुलना" तब परमाणु काउंटर पर आधारित होती है। आप पाते हैं कि एक एप्लिकेशन 2 घटकों के साथ समाप्त होता है, प्रत्येक तुलनात्मक कोड के विभिन्न संस्करणों के खिलाफ निर्मित और रेखांकित किया जाता है।

+11

यह इसका उपयोग करने के लिए एक बहुत अच्छा जवाब है। क्या आपको कुछ गिल्डलाइन हैं जब आपको इसका इस्तेमाल करना चाहिए? क्या मुझे सार्वजनिक एपीआई कार्यों को छोड़कर इसे हर जगह रखना शुरू करना चाहिए? या स्केलैक + जेवीएम इतना स्मार्ट है कि मुझे इसे कहीं भी रखने की ज़रूरत नहीं है? –

+1

@inline से बचने के लिए इसे एक अच्छे उत्तर के रूप में स्वीकार करना। यह प्रश्न बताता है कि इसका उपयोग करने के लिए शायद अधिक उपयोग क्यों नहीं किया जाता है: http://stackoverflow.com/questions/2709095/does-the-inline-annotation-in-scala-really-help-performance –

0

व्यक्तिगत रूप से, मैं अन्य नाम के लिए @inline का उपयोग करें:

class A(param: Param){ 
    @inline def a = param.a 
    def a2() = a * a 
} 

अब, मैं एक तरह से जानना चाहते हैं कि यह कुछ भी नहीं मिल सकता है (मैं उत्पन्न .class jad करने की कोशिश की है, लेकिन यह निष्कर्ष नहीं निकाल सकता है कुछ भी)।

मेरा लक्ष्य यह स्पष्ट करना है कि मैं संकलक को क्या करना चाहता हूं। लेकिन यह तय करें कि सबसे अच्छा क्या है, या बस वह करने में सक्षम है। यदि यह ऐसा नहीं करता है, तो शायद बाद में कंपाइलर संस्करण होगा।

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

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