2016-05-05 6 views
14

मैं परिवर्तन पहचान पर कुछ लेख पढ़ रहा हूं, और उनमें से सभी कहते हैं कि मोनोमोर्फिक फ़ंक्शन पॉलिमॉर्फिक से बहुत तेज हैं। उदाहरण के लिए, यहाँ एक उद्धरण है:जावास्क्रिप्ट में मोनोमोर्फिक और पॉलिमॉर्फिक पदार्थ क्यों करते हैं?

(..) है कि के लिए कारण है, यह एक गतिशील रास्ते में लिखा जाना है, इसलिए यह कोई बात नहीं क्या अपने मॉडल संरचना लग रहा है कि हर घटक जाँच कर सकते हैं पसंद। वीएम को इस प्रकार के गतिशील कोड पसंद नहीं हैं, क्योंकि वे अनुकूलित नहीं कर सकते हैं। इसे पॉलीमोर्फिक माना जाता है क्योंकि ऑब्जेक्ट्स का आकार हमेशा समान नहीं होता है। कोणीय प्रत्येक घटक के लिए रनटाइम पर परिवर्तन डिटेक्टर कक्षाएं बनाता है, जो मोनोमोर्फिक हैं, क्योंकि वे जानते हैं कि घटक के मॉडल का आकार बिल्कुल क्या है। वीएम पूरी तरह से इस कोड को अनुकूलित कर सकते हैं, जो इसे निष्पादित करने में बहुत तेज़ बनाता है। अच्छा बात है कि हम, बहुत ज्यादा है कि के बारे में परवाह है क्योंकि कोणीय यह स्वचालित रूप से करता है की जरूरत नहीं है (..),

Source

है। अब मैं monomoprhic के उदाहरण खोजने की कोशिश कर रहा था बनाम polymorphic, लेकिन इसे कहीं भी नहीं मिला। क्या कोई अंतर को समझाने की देखभाल कर सकता है, और यह तेज़ क्यों है?

+8

Obligatory read: http://mrale.ph/blog/2015/01/11/whats-up-with-monomorphism.html (पहला Google हिट, बीटीडब्ल्यू) – Bergi

उत्तर

10

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

इसका कारण इस v8-specific guideline document में अच्छी तरह से प्रलेखित है जहां एक पूर्णांक बनाम सामान्य संख्या अनुकूलन समझाया गया है। आप कहते हैं:

function add(a, b) { return a + b; } 

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

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

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

https://youtu.be/UJPdhx5zTaw?t=26m26s

संक्षेप में:: कार्यों कि बार-बार एक ही प्रकार के साथ लागू कर रहे हैं अनुकूलित कर रहे हैं

यहाँ एक अधिक सामान्य विवरण v8 के विशेष रूप से अनुकूलन के संकलक (गूगल आई/ओ से 2012) है जेआईटी कंपाइलर में, इसलिए तेज़।

3

मेरे ज्ञान के लिए, monomorphism एक बहुत ही असामान्य शब्द है। मैंने व्यक्तिगत रूप से कोडिंग के लिए इसे कभी नहीं सुना है। यह पता लगाने के लिए कि क्या monomorphism है, हालांकि, मुझे लगता है कि हम क्या polimorphism क्या देखकर इसका मतलब क्या अनुमान लगा सकते हैं।

पॉलिमॉर्फिज्म: यह विचार है कि कई (पॉली-) विभिन्न वस्तुओं को मशीन/रनटाइम/दुभाषिया के समान प्रकार से प्रदर्शित किया जा सकता है। उदाहरण के लिए, सी # में, आपके पास जितनी चाहें उतनी कक्षाएं हो सकती हैं जो ICloneable लागू करती हैं और उनमें से कोई भी एक सामान्य लिंक्ड सूची (उदाहरण के लिए) के लिए प्रतिलिपि निर्माता में उपयोग की जा सकती है। Full un-tested class here as an example if you're interested

ठीक है तो मोनोमोर्फिक का क्या अर्थ है?

मेरे लिए मोनोमोर्फिक का अर्थ है कि ऑब्जेक्ट का दुभाषिया उस सटीक प्रकार को संभालता है जिसकी अपेक्षा की जा रही है, और अपेक्षित प्रकार के लिए कोई विरासत या संशोधन संभव नहीं है। इस संदर्भ में, बतख टाइप की गई जावास्क्रिप्ट भाषा के साथ, वीएम कहता है "इस जावास्क्रिप्ट ऑब्जेक्ट में इन सटीक गुण हैं जो इन सटीक प्रकार हैं और नाम जैसे हैं"। सी # में, अगर हम मोनोमोर्फिक बनना चाहते थे, तो सामान्य प्रकार के प्रतिबंध असंभव होंगे क्योंकि T को हर समय एक ही प्रकार का होना होगा।

This link प्रदर्शन के लिए महत्वपूर्ण क्यों है, यह एक अच्छी मार्गदर्शिका प्रदान करता है। मेरे लिए यह नीचे संक्षेप में किया जा सकता है।

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

हकीकत में, इंजन एक ही कार्य में पारित होने वाली विभिन्न वस्तुओं की एक छोटी राशि को संभालने का प्रयास करते हैं लेकिन यदि ऑब्जेक्ट हमेशा कोड की एक ही पंक्ति पर समान दिखता है तो वीएम सबसे तेज़ होगा।

स्पष्टता के लिए उदाहरण

निम्न उदाहरण है मान्य जावास्क्रिप्ट, लेकिन तर्क o, f1 कार्य करने के लिए monomorphic नहीं है क्योंकि वीएम दो अलग तरह से आकार का ऑब्जेक्ट्स में पारित किया जा रहा संभाल करने की जरूरत है।

function f1(o) { 
 
    console.log(o.prop1) 
 
    console.log(o.prop2) 
 
} 
 

 
// ... 
 

 
o1 = { prop1: 'prop1', prop2: 'prop2' } 
 
o2 = { prop1: 'prop1', prop2: 'prop2', prop3: 'prop3' } 
 

 
f1(o1) 
 
f1(o2)

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

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