11

やや関連:Javaのlibxml2

はい、この質問はかなり長文です - 申し訳ありません。私は可能な限り高密度に保ちました。全体を読む前に簡単に確認できるように、質問を太字にしました。

sax の解析が dom の解析よりも速いのはなぜですか? 私が思いつくことができる唯一のことは、おそらくsaxを使用すると、受信データの大部分を無視しているため、気にしないxmlの部分を処理する時間を無駄にしないということです。IOW - SAX で解析した後、元の入力を再作成できません。 SAX パーサーがすべての xml ノードを考慮できるように (したがって、元のノードを再作成できるように) 記述した場合、DOM よりも高速ではないでしょうか?

私が尋ねている理由は、xml ドキュメントをより迅速に解析しようとしているからです。解析後にxmlツリー全体にアクセスする必要があります。サード パーティのサービスをプラグインするためのプラットフォームを作成しているため、xml ドキュメントのどの部分が必要で、どの部分が必要でないかを予測できません。入ってくるドキュメントの構造さえ知りません。これが、jaxb や sax を使用できない理由です。xml ドキュメントは小さく、一度に必要なメモリは 1 つだけなので、メモリ フットプリントは問題になりません。私を殺しているのは、この比較的小さな xml ドキュメントを解析するのにかかる時間です。以前にstaxを使用したことはありませんが、おそらく中間点である可能性があるため、さらに調査する必要がありますか? 私の理解が正しければ、 このように、元の解析時間は速いかもしれませんが、まだトラバースしていないツリーの部分をトラバースするように要求するたびに、処理が行われますか?

ほとんどの質問に回答するリンクを提供していただければ、私はあなたの回答を受け入れます (別の場所で既に回答されている場合は、私の質問に直接回答する必要はありません)。

更新: sax で書き直したところ、平均 2.1 ミリ秒でドキュメントが解析されました。これは、dom が取っていた 2.5 ミリ秒よりも改善 (16% 高速) ですが、私 (その他) が推測したほどではありません。

ありがとう

4

4 に答える 4

15

ドキュメントを解析するだけだと仮定すると、さまざまなパーサー標準のランキングは次のようになります。

1. StAX が最速

  • イベントはあなたに報告されます

2. 次はSAX

  • StAX が行うすべての処理に加えて、コンテンツが自動的に実現されます (要素名、名前空間、属性など)。

3.DOMは最後

  • これは、SAX が行うすべてのことを行い、情報を Node のインスタンスとして提示します。

ユースケース

  • すべての XML を維持する必要がある場合は、DOM が標準的な表現です。XSLT 変換(javax.xml.transform )、XPath ( javax.xml.xpath )、およびスキーマ検証 ( javax.xml.validation ) API ときれいに統合されます。ただし、パフォーマンスが重要な場合は、DOM パーサーが DOM を構築するよりも高速に、StAX を使用して独自のツリー構造を構築できる場合があります。
于 2010-09-29T20:03:03.887 に答える
12

DOM 解析では、ドキュメント全体をメモリにロードしてから、ツリーを走査して必要な情報を見つける必要があります。

SAX は、基本的な IO を実行するのに必要なだけのメモリしか必要とせず、ドキュメントが読み取られているときに必要な情報を抽出できます。SAX はストリーム指向であるため、別のプロセスによってまだ書き込まれているファイルを処理することもできます。

于 2010-09-29T19:42:02.340 に答える
12

DOM パーサーは多くの場合、SAX パーサーを使用してドキュメントを内部的に解析し、アプリケーションがそれらを気にしない場合でも、各ノードを表すオブジェクトを作成および操作するという余分な作業を行うため、SAX の方が高速です。

SAX を直接使用するアプリケーションは、DOM「パーサー」よりも効率的に情報セットを利用する可能性があります。

StAX は、アプリケーションが SAX のイベ​​ント ドリブン アプローチよりも便利な API を取得できる一方で、完全な DOM を作成する非効率性に苦しむことがない、満足のいく媒体です。

于 2010-09-29T19:42:47.503 に答える
2

SAX は DOM よりも高速です (通常、大きな XML ドキュメントを読み取るときに感じられます)。SAX は一連のイベント (通常はハンドラーを介してアクセス) として情報を提供しますが、DOM はノードを作成し、DOM ツリーが完全に作成されるまでノード作成構造を管理します ( XML ドキュメントで表されます)。

比較的小さなファイルの場合、効果は感じられません (ただし、ノード要素やノード リストを作成するために DOM によって余分な処理が行われる可能性があります)。

StAX で遊んだことがないので、StAX についてコメントすることはできません。

于 2010-09-29T20:02:22.430 に答える