का उपयोग करने का निर्णय लेने पर निर्णय लेना मैं एक कस्टम ऑब्जेक्ट -> एक्सएमएल क्रमबद्धता उपयोगिता को अनुकूलित कर रहा हूं, और यह सब कुछ किया और काम कर रहा है और यह मुद्दा नहीं है।XmlDocument बनाम XmlReader
यह फ़ाइल को XmlDocument
ऑब्जेक्ट में लोड करके काम करता है, फिर सभी बच्चे नोड्स के माध्यम से फिर से चल रहा है।
मुझे लगा कि शायद का उपयोग XmlDocument
होने की बजाय पूरी चीज़ को लोड/पार्स करना तेज होगा, इसलिए मैंने उस संस्करण को भी लागू किया।
एल्गोरिदम बिल्कुल वही हैं, मैं XmlNode
बनाम XmlReader
से निपटने की कार्यक्षमता को सारणी देने के लिए एक रैपर वर्ग का उपयोग करता हूं। उदाहरण के लिए, GetChildren
विधियों का उत्पादन या तो बच्चे XmlNode
या एक उपट्री XmlReader
देता है।
इसलिए मैंने दोनों संस्करणों का परीक्षण करने और एक गैर-तुच्छ डेटा सेट (लगभग 1,350 तत्वों के साथ एक 900 केबी एक्सएमएल फ़ाइल) का उपयोग करने के लिए एक परीक्षण चालक लिखा।
हालांकि, JetBrains dotTRACE का उपयोग करके, मुझे लगता है कि XmlReader
संस्करण वास्तव में XmlDocument
संस्करण से धीमा है! ऐसा लगता है कि XmlReader
में कुछ महत्वपूर्ण प्रसंस्करण शामिल हैं जब मैं बाल नोड्स पर पुनरावृत्ति कर रहा हूं।
तो मैं कहता हूँ कि सभी इस पूछने के लिए:
क्या XmlDocument
और XmlReader
, और किस परिस्थिति में के फायदे/नुकसान या तो आप का उपयोग करना चाहिए रहे हैं?
मेरा अनुमान है कि फ़ाइल आकार सीमा है जिस पर XmlReader
प्रदर्शन में अधिक किफायती हो जाता है, साथ ही कम स्मृति-गहन भी हो जाता है। हालांकि, यह सीमा 1 एमबी से ऊपर प्रतीत होती है।
मैं ReadSubTree
हर बार बच्चे नोड्स पर कार्रवाई करने के फोन कर रहा हूँ:
public override IEnumerable<IXmlSourceProvider> GetChildren()
{
XmlReader xr = myXmlSource.ReadSubtree();
// skip past the current element
xr.Read();
while (xr.Read())
{
if (xr.NodeType != XmlNodeType.Element) continue;
yield return new XmlReaderXmlSourceProvider (xr);
}
}
कि परीक्षण एकल स्तर (यानी विस्तृत & उथले) पर वस्तुओं का एक बहुत कुछ करने के लिए लागू होता है - लेकिन मुझे आश्चर्य है कि कैसे अच्छी तरह से XmlReader
किरायों जब एक्सएमएल गहराई & चौड़ा है? अर्थात। जिस एक्सएमएल के साथ मैं काम कर रहा हूं वह डेटा ऑब्जेक्ट मॉडल, 1 ऑब्जेक्ट ऑब्जेक्ट की तरह कई बच्चे ऑब्जेक्ट्स आदि है: 1..M..M..M
मैं पहले से ही एक्सएमएल की संरचना को नहीं जानता हूं, मैं पार्सिंग कर रहा हूं, इसलिए मैं कर सकता हूं इसके लिए अनुकूलित नहीं है।
मैंने हमेशा सोचा है कि XmlDocument और XmlReader दोनों क्यों थे ... –
वास्तव में XMLDocument और XMLReader के लिए एक और विकल्प है। अब आप LINQ का उपयोग XML से कर सकते हैं लेकिन वास्तव में XMLReader अधिकतर तरीकों से अधिक कुशल है। – Tarik
रुको। आपकी 'GetChildren' विधि' XmlReader' लौटाती है? आपका मतलब है, आप हर बार जब आप एक बच्चे नोड को संसाधित करते हैं तो आप 'XmlReader.Create() 'को कॉल कर रहे हैं? –