Xml、XmlDocuments を使用した XPath、XSLT、または Linq のどれが、より効率的ですか? 質問する

Xml、XmlDocuments を使用した XPath、XSLT、または Linq のどれが、より効率的ですか? 質問する

私は次の 2 つの方法の両方を使用して XML を解析しました...

  • オブジェクト モデルと XPath クエリを使用して XmlDocument を解析します。
  • XSL/T

でも、使ったことないです…

  • .Net 3.5 で新しく導入された Linq XML オブジェクト モデル

3 つの選択肢の比較効率を教えていただけますか?

特定の使用法が要因になることは承知していますが、大まかな概要を知りたいだけです。たとえば、Linq オプションは他のオプションよりも大幅に遅いのでしょうか?

ベストアンサー1

XML ドキュメントをクエリする最も速い方法は、最も難しい方法です。XmlReader を使用して入力ストリームを処理し、ノードを読み取ったときに処理するメソッドを作成します。これは、解析とクエリを 1 つの操作に組み合わせる方法です (XPath を使用するだけではこれは実現されません。XmlDocument と XPathDocument はどちらも Load メソッドでドキュメントを解析します)。通常、これは、非常に大きな XML データ ストリームを処理する場合にのみ適切な方法です。

あなたが説明した 3 つの方法はすべて、同じように動作します。XSLT は、XPath の非効率性とテンプレート マッチングの非効率性を組み合わせることができるため、最も遅くなる可能性が大いにあります。XPath クエリと LINQ クエリはどちらも、XML ノードの列挙可能なリストを線形検索するという、基本的に同じことを行います。XPath は実行時に解釈されますが、LINQ はコンパイル時に解釈されるため、実際には LINQ の方がわずかに高速になると思います。

しかし、一般的には、使用するテクノロジーよりも、クエリの書き方が実行速度に大きな影響を与えます。

XML ドキュメントに対して高速なクエリを作成する方法は、XPath を使用する場合でも LINQ を使用する場合でも同じです。つまり、実行中にできるだけ少ないノードにアクセスするようにクエリを作成します。どのテクノロジを使用するかは関係ありません。ドキュメント内のすべてのノードを調べるクエリは、それらの小さなサブセットのみを調べるクエリよりも実行速度がはるかに遅くなります。その実行能力は、何よりも XML の構造に依存します。要素の階層をナビゲートできるドキュメントは、一般に、すべての要素がドキュメント要素の子であるドキュメントよりもクエリがはるかに高速になります。

編集:

XML をクエリする絶対的に最速の方法が最も難しいという私の考えは正しいと確信していますが、実際に最速 (かつ最も難しい) な方法は を使用せずXmlReader、ストリームからの文字を直接処理する状態マシンを使用します。正規表現を使用して XML を解析する場合と同様に、これは通常、ひどいアイデアです。ただし、機能を速度と引き換えるオプションは提供されます。アプリケーションに必要のない XML の部分 (名前空間の解決、文字エンティティの拡張など) を処理しないことにすることで、 よりも高速に文字のストリームをシークする何かを構築できますXmlReader。これが悪いアイデアではないアプリケーションも考えられますが、多くは思いつきません。

おすすめ記事