मैं देखना चाहता था कि इनमें से कौन-से सुझाए गए समाधानों में सबसे अच्छा प्रदर्शन किया गया है, इसलिए मैंने कुछ तुलनात्मक परीक्षण किए। रुचि के बाहर, मैंने भी ग्रेग द्वारा सुझाए गए सादे पुराने System.Xml विधि की LINQ विधियों की तुलना की । भिन्नता दिलचस्प थी और न कि मुझे क्या उम्मीद थी, जिसमें सबसे धीमी विधियां सबसे तेज से 3 गुना अधिक धीमी थीं ।
परिणाम सबसे धीमी गति से करने का आदेश दिया:
- क्रिएटर - इंस्टेंट हंटर (0.113 सेकंड)
- सादा पुराना System.Xml - ग्रेग हर्लमैन (0.134 सेकंड)
- स्ट्रिंग संघनन के साथ एकत्र - माइक पॉवेल (0.324 सेकंड)
- स्ट्रिंगबर्ल - विन (0.333 सेकंड)
- स्ट्रिंग.जून सरणी पर - टेरी (0.360 सेकंड)
- स्ट्रिंग.कोनकैट एरे पर - मार्सिन कोसिरादज़की (0.364)
तरीका
मैंने 20 समान नोड्स (जिसे 'संकेत' कहा जाता है) के साथ एकल XML दस्तावेज़ का उपयोग किया:
<hint>
<strong>Thinking of using a fake address?</strong>
<br />
Please don't. If we can't verify your address we might just
have to reject your application.
</hint>
ऊपर दिए गए सेकंड के रूप में दिखाए गए नंबर 20 नोड्स के "इनर एक्सएमएल" को निकालने, एक पंक्ति में 1000 बार और 5 रन के औसत (मतलब) लेने का परिणाम है। मैंने XML को लोड करने और पार्स करने के XmlDocument
लिए ( System.Xml विधि के लिए) या XDocument
(अन्य सभी के लिए) को शामिल नहीं किया।
मेरे द्वारा उपयोग किए गए LINQ एल्गोरिदम थे: (C # - सभी एक XElement
"पैरेंट" लेते हैं और आंतरिक XML स्ट्रिंग लौटाते हैं)
CreateReader:
var reader = parent.CreateReader();
reader.MoveToContent();
return reader.ReadInnerXml();
स्ट्रिंग संघनन के साथ एकत्र:
return parent.Nodes().Aggregate("", (b, node) => b += node.ToString());
StringBuilder:
StringBuilder sb = new StringBuilder();
foreach(var node in parent.Nodes()) {
sb.Append(node.ToString());
}
return sb.ToString();
String.Join सरणी पर:
return String.Join("", parent.Nodes().Select(x => x.ToString()).ToArray());
स्ट्रिंग पर सरणी:
return String.Concat(parent.Nodes().Select(x => x.ToString()).ToArray());
मैं "सादा पुराना System.Xml" एल्गोरिथ्म यहाँ नहीं दिखा रहा हूँ क्योंकि यह सिर्फ कॉल कर रहा है। नोड्स पर .nerXml।
निष्कर्ष
यदि प्रदर्शन महत्वपूर्ण है (जैसे बहुत सारे XML, बार-बार पार्स किए गए), तो मैं हर बार डैनियल की CreateReader
विधि का उपयोग करता हूं । यदि आप कुछ सवाल कर रहे हैं, तो आप माइक के अधिक संक्षिप्त एग्रीगेट विधि का उपयोग करना चाह सकते हैं।
यदि आप बहुत सारे नोड्स (शायद 100 के) के साथ बड़े तत्वों पर एक्सएमएल का उपयोग कर रहे हैं, तो आप शायद StringBuilder
एग्रीगेट विधि का उपयोग करने का लाभ देखना शुरू कर देंगे , लेकिन खत्म नहीं हुआ CreateReader
। मुझे नहीं लगता कि इन स्थितियों में Join
और Concat
विधियां कभी भी इन स्थितियों में अधिक कुशल होंगी क्योंकि एक बड़ी सूची को एक बड़ी सरणी में बदलने के लिए (यहां तक कि छोटी सूचियों के साथ भी स्पष्ट है)।