2008-09-17 14 views
32

, क्या लागू-टेम्पलेट और कॉल-टेम्पलेट के बीच कोई प्रदर्शन अंतर है? मेरी स्टाइलशीट में ऐसे कई उदाहरण हैं जहां मैं या तो उपयोग कर सकता हूं, जो सबसे अच्छा विकल्प है?प्रदर्शन: XSLT प्रसंस्करण में कॉल-टेम्पलेट बनाम लागू-टेम्पलेट

+1

का उदाहरण दिया गया तो कम से कम कुछ तुलना – Pacerier

उत्तर

10

लागू-टेम्पलेट और कॉल-टेम्पलेट एक ही कार्य नहीं करता है, प्रदर्शन तुलना वास्तव में यहां प्रासंगिक नहीं है। कॉल-टेम्पलेट एक टेम्पलेट नाम पैरामीटर के रूप में लेता है जबकि लागू-टेम्पलेट एक xpath अभिव्यक्ति लेता है। लागू-टेम्पलेट इसलिए अधिक शक्तिशाली है क्योंकि आप वास्तव में नहीं जानते कि कौन सा टेम्पलेट निष्पादित किया जाएगा। यदि आप जटिल xpath अभिव्यक्तियों का उपयोग करते हैं तो आपको प्रदर्शन समस्याएं मिलेंगी। अपने xpath अभिव्यक्तियों में "//" से बचें क्योंकि आपके इनपुट दस्तावेज़ के प्रत्येक नोड का मूल्यांकन किया जाएगा।

+1

+1 किया जा सकता है - मेरे पास कोई वास्तविक डेटा नहीं है लेकिन मुझे पूरा यकीन है कि '//' न केवल धीमा है, बल्कि [गंध] (http: //en.wikipedia।संगठन/विकी/कोड_समेल) खराब। –

4

यह आपके द्वारा उपयोग किए जा रहे एक्सएमएल पार्सर पर निर्भर हो सकता है। मैं .NET 2003 पार्सर के अलावा कुछ भी नहीं बोल सकता जहां मैंने push vs pull एक्सएसएलटी कोड पर कुछ अनौपचारिक प्रदर्शन परीक्षण किए। यह आप जो पूछ रहे हैं उसके समान है: लागू-टेम्पलेट = पुश और कॉल-टेम्पलेट = पुल। मुझे विश्वास था कि पुश तेज होगा, लेकिन ऐसा नहीं था। यह भी लगभग था।

क्षमा करें मेरे पास अब सटीक परीक्षण नहीं हैं। मैं इसे पसंद के अपने पार्सर से बाहर करने की कोशिश करता हूं और देखता हूं कि कोई बड़ा अंतर है या नहीं। मेरी शर्त नहीं होगी।

57

सभी प्रदर्शन प्रश्नों के साथ, उत्तर आपके विशेष कॉन्फ़िगरेशन (विशेष रूप से एक्सएसएलटी प्रोसेसर का उपयोग कर रहे हैं) और आपके द्वारा किए जा रहे प्रसंस्करण की तरह निर्भर करेगा।

<xsl:apply-templates> नोड्स का अनुक्रम लेता है और उनमें से एक-एक करके जाता है। प्रत्येक के लिए, यह टेम्पलेट को सर्वोच्च प्राथमिकता के साथ रेखांकित करता है जो नोड से मेल खाता है, और इसे आमंत्रित करता है। तो <xsl:apply-templates><xsl:for-each> की तरह <xsl:choose> के अंदर है, लेकिन अधिक मॉड्यूलर है।

इसके विपरीत, <xsl:call-template> नाम से एक टेम्पलेट को आमंत्रित करता है। संदर्भ नोड में कोई परिवर्तन नहीं है (<xsl:for-each>) और किस टेम्पलेट का उपयोग करने के बारे में कोई विकल्प नहीं है।

तो ठीक उसी परिस्थिति के साथ, आप कल्पना कर सकते हैं कि <xsl:call-template> तेज होगा क्योंकि यह कम काम कर रहा है। लेकिन यदि आप ऐसी परिस्थिति में हैं जहां <xsl:apply-templates> या <xsl:call-template> का उपयोग किया जा सकता है, तो संभवतः आप दृश्यों के पीछे, प्रोसेसर के लिए यह कर रहे हैं, XSLT में, <xsl:for-each> और <xsl:choose> स्वयं कर रहे हैं। तो अंत में मुझे लगता है कि यह शायद संतुलन से बाहर हो जाएगा। लेकिन जैसा कि मैंने कहा है कि यह आपके प्रोसेसर के अनुकूलन के प्रकार पर निर्भर करता है और आप वास्तव में क्या कर रहे हैं। इसे मापें और देखें।

मेरे जब मिलान टेम्पलेट का उपयोग और जब करने के लिए नामित टेम्पलेट का उपयोग करने के बारे में अंगूठे का नियम हैं:

  • उपयोग <xsl:apply-templates> और मिलान टेम्पलेट्स आप एक परिणाम बनाने के लिए अलग-अलग नोड्स को प्रोसेस कर रहे हैं; मोड का उपयोग करें यदि किसी विशेष नोड को कई अलग-अलग तरीकों से संसाधित करने की आवश्यकता होती है (जैसे किसी दस्तावेज़ के शरीर बनाम सामग्री की तालिका में)
  • <xsl:call-template> और एक नामित टेम्पलेट का उपयोग करें यदि आप किसी व्यक्तिगत नोड के अलावा कुछ अन्य संसाधित कर रहे हैं, इस तरह के तार या नंबर या नोड्स के सेट के रूप में
  • (XSLT 2.0 में) <xsl:function> का उपयोग आप एक परमाणु मूल्य या एक मौजूदा नोड लौट रहे हैं तो
+1

यह बताने के लिए धन्यवाद कि वर्तमान संदर्भ नोड पर चल रहा है –