2011-08-19 12 views
6

सबसे पहले, कृपया मेरे प्रश्न के शीर्षक को सही करने के लिए स्वतंत्र महसूस करें, मैं कार्यात्मक-प्रोग्रामिंग लिंगो से बहुत परिचित नहीं हूं।स्कैला - 'प्रथम श्रेणी के कार्यों' का आह्वान करने के उपर

मेरा सवाल यह है कि, 'चर की सामग्री' के रूप में कार्य करने के लिए कोई ओवरहेड (और यह कितना महत्वपूर्ण है) है। निम्नलिखित कोड में उदाहरण के लिए:

class Processor { 
    val map = Map[Class[_],AnyRef => Something](...) 

    def process(c:AnyRef):Something = map(c.getClass)(c) 
    def worksFor:List[Class[_]] = map.map(_._1) 
} 

, वास्तव में अच्छा है की तुलना में:

class Processor { 
    def worksFor = List(classOf[Bears], classOf[Beets], classOf[BattlestarGalactica]) 

    def process(c: AnyRef) = { 
    c match { 
     case c: Bears .... 
     . 
     . 
     . 
    } 
    } 
} 

लेकिन यह किसी भी बदतर प्रदर्शन करेंगे? (जाहिर है यह मानचित्र की वजह से अधिक स्मृति लेगा)

किसी भी प्रकार के उत्तर के लिए धन्यवाद!

उत्तर

11

जब आप कोई मान के रूप में एक समारोह असाइन करते हैं, वस्तु बनाई समारोह वर्गों में से एक का एक उदाहरण (Function1 वह एक ही तर्क, Function2 लेता है अगर यह दो तर्क लेता है, आदि) है। असल में फ़ंक्शन का आविष्कार FunctionN ऑब्जेक्ट पर apply विधि को कॉल करने का मामला है।

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


अनिवार्य रूप से, कोई ओवरहेड नगण्य होगा। सभी अनुकूलन के साथ, आपके कोड को कृत्रिम रूप से कम/कम प्राकृतिक तरीके से लिखना समयपूर्व होगा जब तक कि आपने यह नहीं पहचाना कि यह एक प्रदर्शन बाधा है।

और यदि प्रदर्शन वास्तव में यहां एक महत्वपूर्ण समस्या थी, तो संभावना है कि आप या तो विकल्प से अधिक अनुकूलित कुछ के लिए जा रहे हैं।

इस बीच, आराम करें और "अच्छीता" का आनंद लें कि प्रथम श्रेणी के कार्य आपको देते हैं!

+0

विस्तृत उत्तर के लिए धन्यवाद। मुझे खुशी है कि मैं पहले विकल्प का उपयोग कर सकता हूं, फिर :) – Arg

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

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