प्रस्तावनाक्या 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 भेजने साइटों के लिए संभव है और विशिष्ट अनुकूलन एक लुकअप कर से बचने के लिए क्या हैं?
क्या शॉर्ट सर्किट के लिए हां, तो विशेष रिसीवर के MethodDictionary से जुड़ी स्थानों के लिए (जैसे #initialize के रूप में) megamorphic चयनकर्ताओं को बढ़ावा देने के बारे में उनके देखो? –
ये विशेष स्थान क्या होंगे? और वे रिसीवर के MethodDictionary से कैसे जुड़ा जा सकता है? – melkyades
मुझे बिल्कुल पता नहीं है। लेकिन हे, शब्दकोश उन चीज़ों को संलग्न करने के लिए बहुत सारी संभावनाएं प्रदान करते हैं! उदाहरण के लिए, मैं कुछ आरक्षित कुंजी (कहें, एक छोटे इंटीजर) के साथ एमडी में एक एसोसिएशन जोड़ने पर विचार करता हूं और वहां मेगामोर्फिक विधि की प्रतिलिपि बनाता हूं। चूंकि सभी चयनकर्ता प्रतीक हैं (और छोटे इंटीग्रेटर्स नहीं) वहां "नियमित" संदेशों के साथ कोई टक्कर नहीं होगी। लेकिन फिर, यह सिर्फ एक विचार है जिसके लिए अधिक सोच और कुछ प्रयोग की आवश्यकता है। –