Bu önerilen çözümlerden hangisinin en iyi performansı gösterdiğini görmek istedim, bu yüzden bazı karşılaştırmalı testler yaptım. İlgi dışında, LINQ yöntemlerini Greg tarafından önerilen düz eski System.Xml yöntemiyle de karşılaştırdım . Varyasyon ilginçti ve beklediğim gibi değildi, en yavaş yöntemler en hızlıdan 3 kat daha yavaştı .
En hızlıdan en yavaşa sıralanan sonuçlar:
- CreateReader - Örnek Avcısı (0.113 saniye)
- Düz eski System.Xml - Greg Hurlman (0.134 saniye)
- Dize birleştirme ile toplama - Mike Powell (0,324 saniye)
- StringBuilder - Vin (0.333 saniye)
- String.Join on array - Terry (0.360 saniye)
- String.Concat on array - Marcin Kosieradzki (0.364)
Yöntem
20 özdeş düğüme sahip tek bir XML belgesi kullandım ('ipucu' adı verilir):
<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>
Yukarıda saniye olarak gösterilen sayılar, 20 düğümün "iç XML" sinin arka arkaya 1000 kez çıkarılmasının ve 5 çalışmanın ortalamasının (ortalama) alınmasının sonucudur. XML'yi yüklemek ve ayrıştırmak için geçen süreyi bir XmlDocument
( System.Xml yöntemi için) veya XDocument
(diğerlerinin tümü için) eklemedim .
Kullandığım LINQ algoritmaları şunlardı: (C # - hepsi bir XElement
"ebeveyn" alır ve iç XML dizesini döndürür)
CreateReader:
var reader = parent.CreateReader();
reader.MoveToContent();
return reader.ReadInnerXml();
Dize birleştirme ile toplayın:
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 on array:
return String.Join("", parent.Nodes().Select(x => x.ToString()).ToArray());
String.Concat dizide:
return String.Concat(parent.Nodes().Select(x => x.ToString()).ToArray());
Sadece düğümlerde .InnerXml'yi çağırdığı için "Düz eski System.Xml" algoritmasını burada göstermedim.
Sonuç
Performans önemliyse (örneğin, sık sık ayrıştırılan çok sayıda XML), Daniel'ınCreateReader
yöntemini her seferinde kullanırdım . Yalnızca birkaç sorgu yapıyorsanız, Mike'ın daha özlü Aggregate yöntemini kullanmak isteyebilirsiniz.
XML'i çok sayıda düğüme (belki 100'ler) sahip büyük öğelerde kullanıyorsanız, muhtemelen StringBuilder
Aggregate yönteminden daha fazla kullanmanın faydasını görmeye başlarsınız , ancak bitmiyor CreateReader
. Büyük bir listeyi büyük bir diziye dönüştürme cezası nedeniyle (burada daha küçük listelerde bile açık) Join
ve Concat
yöntemlerinin bu koşullarda daha verimli olacağını sanmıyorum .