これらの提案されたソリューションのどれが最も効果的かを見たかったので、いくつかの比較テストを実行しました。興味深いことに、私はLINQメソッドをGregによって提案された単純な古いSystem.Xmlメソッドとも比較しました。バリエーションは面白く、私が期待したものではありませんでした。最も遅いメソッドは最も速いメソッドより3倍以上遅くなりました。
結果は、最も速いものから最も遅いものの順に並べられています。
- CreateReader-インスタンスハンター(0.113秒)
- プレーンな古いSystem.Xml-GregHurlman(0.134秒)
- 文字列連結を使用した集計-MikePowell(0.324秒)
- StringBuilder-Vin(0.333秒)
- String.Join on array-Terry(0.360秒)
- 配列上のString.Concat-MarcinKosieradzki(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ノードの「内部XML」を1000回連続で抽出し、5回の実行の平均(平均)をとった結果です。XmlDocument
XMLを(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 on array:
return String.Join("", parent.Nodes().Select(x => x.ToString()).ToArray());
配列のString.Concat:
return String.Concat(parent.Nodes().Select(x => x.ToString()).ToArray());
ここでは、ノードで.InnerXmlを呼び出しているだけなので、「PlainoldSystem.Xml」アルゴリズムは示していません。
結論
パフォーマンスが重要な場合(たとえば、大量のXML、頻繁に解析される場合)、毎回ダニエルの方法を使用しますCreateReader
。いくつかのクエリを実行しているだけの場合は、Mikeのより簡潔なAggregateメソッドを使用することをお勧めします。
StringBuilder
多数のノード(おそらく100)を含む大きな要素でXMLを使用している場合は、Aggregateメソッドを使用することの利点を理解し始めるでしょうが、それ以上ではありませんCreateReader
。大きなリストを大きな配列に変換するというペナルティがあるため、これらの条件でJoin
andメソッドがより効率的になるとは思いません(ここでは小さなリストでも明らかです)。Concat