2015-03-12 10 views
8

प्रस्तावनाक्या megamorphic कॉल साइटों को और अधिक कुशल

यह एक JIT कम्पाइलर में दक्षता संदेश भेजें सुधारने के बारे में है बनाने के लिए विभिन्न तकनीकों हैं। स्मॉलटाक का जिक्र करने के बावजूद, यह प्रश्न सबसे गतिशील जेआईटी संकलित भाषाओं पर लागू होता है।

समस्या

संदेश भेजें साइट को देखते हुए यह monomorphic, बहुरूपी या megamorphic रूप में वर्गीकृत किया जा सकता है। संदेश भेजने के रिसीवर एक ही प्रकार के हमेशा होता है, तो यह एक monomorphic भेजने,

10 timesRepeat: [Object new]. 

जहां new के रिसीवर हमेशा Object है के रूप में है। इस प्रकार के लिए जेआईटी मोनोमोर्फिक इनलाइन कैश उत्सर्जित करता है।

कभी कभी एक दिया भेजने साइट की तरह, कुछ अलग वस्तु प्रकार को संदर्भित करता है:

#(1 'a string' 1.5) do: [:element | element print] 

इस मामले में, print वस्तुओं के विभिन्न प्रकार के लिए भेजा जाता है। इन मामलों के लिए, जेआईटी आमतौर पर पॉलिमॉर्फिक इनलाइन कैश उत्सर्जित करते हैं।

मेगामोर्फिक संदेश तब होता है जब कोई संदेश कुछ ही नहीं बल्कि को एक ही स्थान पर विभिन्न ऑब्जेक्ट प्रकारों के पर भेजा जाता है। initialize प्रारंभ करता है basicNew वस्तु बनाता है

Behavior>>#new 
    ^self basicNew initialize 

यहाँ, है, तो: सबसे प्रमुख उदाहरणों में से एक यह है। आप कर सकता है:

Object new 
OrderedCollection new 
Dictionary new 

और वे सभी एक ही व्यवहार >> # नई विधि पर अमल होगा। चूंकि प्रारंभिकरण के कार्यान्वयन कई वर्गों में अलग है, इसलिए पीआईसी जल्दी भर जाएगी। मैं भेजने साइटों इस तरह का में दिलचस्पी रखता हूँ, जानते हुए भी वे केवल unfrequently (केवल 1% भेजता megamorphic हैं) होते हैं।

प्रश्न

megamorphic भेजने साइटों के लिए संभव है और विशिष्ट अनुकूलन एक लुकअप कर से बचने के लिए क्या हैं?

उत्तर

3

मैं कुछ कल्पना, और अधिक जानना चाहते हैं। बाद एक पीआईसी पूर्ण हो जाता है, हम देखने (यह पूर्ण या वैश्विक कैश्ड एक होने) कॉल करने के लिए होगा, लेकिन अनुकूलन करने के लिए हम कर सकते हैं:

  • रीसायकल पीआईसी, दूर सभी प्रविष्टियों फेंक (कई प्रविष्टियों हो सकता है पुराना और अक्सर इस्तेमाल नहीं किया जाता है)।
  • कॉल विशिष्ट megamorphic देखने (अर्थात एक है कि सभी पहले से कैश होगा एक सरणी प्रकार हैश द्वारा accesed में प्रकार भेजा) किसी प्रकार का।
  • इनलाइन युक्त विधि (जब inlined स्थित भेजें साइट megamorphic जा रहा है बंद हो सकता है)
+0

क्या शॉर्ट सर्किट के लिए हां, तो विशेष रिसीवर के MethodDictionary से जुड़ी स्थानों के लिए (जैसे #initialize के रूप में) megamorphic चयनकर्ताओं को बढ़ावा देने के बारे में उनके देखो? –

+0

ये विशेष स्थान क्या होंगे? और वे रिसीवर के MethodDictionary से कैसे जुड़ा जा सकता है? – melkyades

+1

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

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