2011-05-10 8 views
8

अद्यतन 17.Jul.2013:
XALAN 2.7एक अनुरोध के भीतरdocument() कॉल कैश नहीं है। तो XSL में एक चर में प्रत्येक आवश्यक दस्तावेज़ को स्टोर करना महत्वपूर्ण है।एक्सएसएलटी दस्तावेज़(): क्या यह कई बार कॉल करते समय धीमा है?


मैं काफी कुछ समय के लिए खोज की है और मेरे साधारण सवाल का ठोस जवाब नहीं मिला:

किस तरीके से तेजी से होता है या संकलक "स्मार्ट" पर्याप्त है ताकि दोनों वेरिएंट ही कर रहे हैं ?

नोट: मैं (JDK 1.6 में डिफ़ॉल्ट कार्यान्वयन) Xalan 2.7 उपयोग कर रहा हूँ:

1) मेरे पास है एक बाहरी XML में एक संपत्ति को पढ़ने के लिए:

<xsl:value-of select="document($path)/person/address/city"/> 

जब भी मैं शहर की जरूरत है, मैं उपरोक्त अभिव्यक्ति का उपयोग करता हूं (मान लें 100 बार)

2) दस्तावेज़() 100 बार कॉल करने के बजाय, मैं एक्सएमएल नोड को एक चर में संग्रहीत करता हूं:

<xsl:variable name="node" select="document($path)"/> 

और फिर मैं का उपयोग 100 गुना

<xsl:value-of select="$node/person/address/city"/> 

कौन सा तेज़ी से, बेहतर है, जो कारणों के लिए है? धन्यवाद!

+0

मैं भी एक विशेषज्ञ उत्तर में घुसपैठ कर रहा हूं, लेकिन, जैसा कि मुझे लगता है, 'दस्तावेज़ (path_to_doc)' के एकाधिक कॉल के मामले में, xslt प्रोसेसर कैशिंग प्राप्ति पर निर्भर हैं, मामले में, जब दस्तावेज़ नोड चर चर में संग्रहीत होता है इसे किसी भी मामले में एक बार लोड किया जाना चाहिए। –

+0

हां, मुझे यह भी लगता है कि यह ** प्रोसेसर के कार्यान्वयन ** पर निर्भर करता है, लेकिन मुझे उत्सुकता है कि ** Xalan 2.7 (जेडीके 1.6 में डिफ़ॉल्ट प्रोसेसर) ** यह करता है। – basZero

+0

मैं 100% सकारात्मक नहीं हूं लेकिन मुझे लगता है कि ज़लान 'दस्तावेज़()' परिणाम कैश नहीं करता है, लेकिन xsltproc करता है। हालांकि 'दस्तावेज़()' तर्क को यूआरआई ([देखें spec] (http://www.w3.org/TR/xslt#add-func) के रूप में व्याख्या किया जाता है), इसलिए एक आक्रामक कैशिंग सही समझ में आती है। –

उत्तर

3

दोनों ही तरीकों से एक ही समय के लिए अमल करना चाहिए अगर एक XSLT प्रोसेसर अनुभवहीन नहीं है, क्योंकि दस्तावेज़ समारोह एक ही परिणाम है कि कितनी बार वापस आ जाएगी जब वह एक ही तर्क (रों) के साथ कहा जाता है, कोई फर्क नहीं पड़ता।

// संक्षेप के उपयोग के कारण दोनों विधियां कुशल नहीं हैं, जो पूरे दस्तावेज़ पेड़ को पार करने का कारण बनती है।

मैं की सिफारिश करेंगे और अधिक कुशल दोनों तरीकों पर चर्चा की जा रही है की तुलना में के रूप में निम्नलिखित:

<xsl:variable name="vCities" select="document($pUrl)//cities"/> 

तो केवल संदर्भ$vCities

इस तरह आपने दस्तावेज़ को केवल एक बार पार किया है।

+3

+1। दिमित्री, क्या आप मुझे बताए गए बेवकूफ नियम के लिए संदर्भ दे सकते हैं? मैंने पहले सुना है लेकिन एक्सएसएलटी 1.0 या 2.0 चश्मे में इसे देखने के लिए आश्चर्यचकित नहीं था। – LarsH

+0

@ लार्सएच: मुझे भी surprized किया गया था - कहीं भी एक इरेटा दस्तावेज़ में हो सकता है ... –

+0

बीटीडब्ल्यू: '//' केवल एक उदाहरण था और मेरे सवाल का हिस्सा नहीं होना चाहिए था, क्षमा करें! फोकस 'दस्तावेज़()' फ़ंक्शन पर है। तो मैं अभी भी अनिश्चित हूं कि यह ** XALAN 2.7 ** में कोई फर्क पड़ता है! – basZero

2

ऐसा लगता है कि आप शामिल सिद्धांतों को समझते हैं, इसलिए आपको वहां कोई स्पष्टीकरण की आवश्यकता नहीं है।

यदि आप जानना चाहते हैं कि Xalan 2.7 यह कैसे करता है, तो निश्चित उत्तर Xalan 2.7 के साथ परीक्षण करके पाया जाएगा, जिसमें काफी पर्याप्त परीक्षण होगा।

@Dimitre के रूप में नोट किया गया है, इनमें से कोई भी // की वजह से आवश्यक रूप से कुशल नहीं है, हालांकि कुछ प्रोसेसर इस तरह के पथों को अनुकूलित करने के बारे में स्मार्ट हैं, समस्या को कम करते हैं।आप मदद कर सकता है एक चर में city तत्व रखकर प्रोसेसर और अधिक कुशल हो:

<xsl:variable name="city" select="(document($path)//city)[1]"/> 
... 
<xsl:value-of select="$city"/> 

मैं आगे अनुकूलन के लिए वहाँ में [1] जोड़ा क्योंकि तुम ने कहा, "शहर" (यानी आप केवल एक उम्मीद), और इस की अनुमति देता है पहले city तत्व को ढूंढने के बाद रोकने के लिए एक स्मार्ट प्रोसेसर।

+0

+1। –

+0

चर्चा '//' के बारे में नहीं है, मैंने इसे उदाहरण से हटा दिया है। मैं प्रत्येक दस्तावेज़() 'कॉल के लिए लॉग में अनुरोध देखने का प्रयास करके 'दस्तावेज़()' का परीक्षण करूंगा। लेकिन इसमें निवेश करने से पहले, मैंने सोचा कि यहां कोई व्यक्ति इसे जानता है (स्रोत कोड से)। – basZero

+0

किसी को भी यह समझाने की परवाह है कि डाउनवोट क्यों? पता नहीं है कि यह @bas – LarsH

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