ฉันต้องการดูว่าโซลูชันใดที่แนะนำเหล่านี้ทำงานได้ดีที่สุดดังนั้นฉันจึงทำการทดสอบเปรียบเทียบ ฉันยังได้เปรียบเทียบวิธี LINQ กับวิธีการแบบเก่าSystem.Xml ที่ Greg แนะนำ รูปแบบที่เป็นที่น่าสนใจและไม่ใช่สิ่งที่ผมคาดว่าจะด้วยวิธีการที่ช้าที่สุดเป็นมากกว่า 3 ครั้งช้ากว่าที่เร็วที่สุด
ผลลัพธ์เรียงลำดับโดยเร็วที่สุดไปช้าที่สุด:
- CreateReader - อินสแตนซ์ฮันเตอร์ (0.113 วินาที)
- ระบบเก่าแบบธรรมดา Xml - Greg Hurlman (0.134 วินาที)
- รวมกับการต่อสตริง - Mike Powell (0.324 วินาที)
- StringBuilder - Vin (0.333 วินาที)
- สตริงเข้าร่วมอาร์เรย์ - เทอร์รี่ (0.360 วินาที)
- String.Concat ในอาร์เรย์ - Marcin Kosieradzki (0.364)
วิธี
ฉันใช้เอกสาร XML เดียวที่มี 20 โหนดเหมือนกัน (เรียกว่า 'คำใบ้'):
<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>
ตัวเลขที่แสดงเป็นวินาทีข้างต้นเป็นผลลัพธ์ของการแยก "XML ภายใน" ของ 20 โหนด 1000 ครั้งในแถวและรับค่าเฉลี่ย (หมายถึง) จำนวน 5 การทำงาน ฉันไม่ได้รวมเวลาที่ใช้ในการโหลดและแยกวิเคราะห์ XML เป็นXmlDocument
(สำหรับวิธีSystem.Xml ) หรือXDocument
(สำหรับส่วนอื่น ๆ ทั้งหมด)
ขั้นตอนวิธี LINQ ที่ฉันใช้คือ: (C # - ทั้งหมดใช้XElement
"parent" และส่งคืนสตริง 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();
สตริงเข้าร่วมในอาร์เรย์:
return String.Join("", parent.Nodes().Select(x => x.ToString()).ToArray());
String.Concat ในอาร์เรย์:
return String.Concat(parent.Nodes().Select(x => x.ToString()).ToArray());
ฉันไม่ได้แสดงอัลกอริทึม "Plain old System.Xml" ที่นี่เพราะมันเพิ่งเรียกว่า. InnerXml บนโหนด
ข้อสรุป
ถ้าประสิทธิภาพเป็นสิ่งสำคัญ (เช่นจำนวนมาก XML แจงบ่อย) ผมใช้ของแดเนียลCreateReader
วิธีการทุกครั้ง หากคุณเพียงแค่ทำแบบสอบถามสองสามข้อคุณอาจต้องการใช้วิธีการรวมที่กระชับยิ่งขึ้นของไมค์
หากคุณกำลังใช้ XML ในองค์ประกอบที่มีขนาดใหญ่ที่มีจำนวนมากของโหนด (อาจจะ 100), คุณอาจจะเริ่มต้นที่จะเห็นประโยชน์ของการใช้StringBuilder
มากกว่าวิธีการรวม CreateReader
แต่ไม่เกิน ฉันไม่คิดว่าJoin
และConcat
วิธีการจะมีประสิทธิภาพมากขึ้นในเงื่อนไขเหล่านี้เนื่องจากโทษของการแปลงรายการขนาดใหญ่เป็นอาร์เรย์ขนาดใหญ่