83

このトピックについてしばらく検索したところ、いくつかの結果も見つかりました。これについては、投稿の最後に記載しています。誰かが私がそれらの下にリストされたケースのためにこれらの3つの質問に正確に答えるのを手伝ってもらえますか?

  1. XmlSluperを使用するユースケースがXmlParserよりも理にかなっているのはどれですか(API /構文の使いやすさの観点から)?

  2. どちらがメモリ効率が高いですか?(Slurperのように見えます)

  3. どちらがxmlをより速く処理しますか?

ケースa。xml内のほぼすべてのノードを読み取る必要がある場合はどうなりますか?

ケースb。(gpath式を使用するなど)いくつかのノードを読み取る必要がある場合はどうなりますか?

ケースc。xmlを更新/変換する必要がある場合は?

xmlドキュメントが些細なものではない場合(xmlの深さとサイズのレベル)。

リソース

http://www.tutkiun.com/2009/10/xmlparser-and-xmlslurper.htmlの状態:

XMLParserとXMLSlurperの違い:

XMLParserとXMLSlurperは、単純な読み取りに使用する場合は類似点がありますが、高度な読み取りに使用する場合や、他の形式のXMLドキュメントを処理する場合は、2つの間に違いがあります。

XMLParserは、ドキュメントの解析後に中間結果を保存します。しかしその一方で、

XMLSlurperは、XMLドキュメントの処理後に内部結果を保存しません。

解析された情報を処理すると、実際の基本的な違いが明らかになります。これは、ストリーミングシナリオで直接インプレースデータ操作および処理を使用して処理する場合です。

http://groovy.dzone.com/news/john-wilson-groovy-and-xml

groovyのドキュメント(XmlParserXmlSlurper)とgroovyのサイトはそれらをうまく説明していますが(ここここ)、前述の質問を説明するのにうまくいきません。

4

2 に答える 2

109

XmlSlurper と XmlParser の大きな違いは、パーサーが DOM に似たものを作成するのに対し、Slurper は本当に必要な場合にのみ構造を作成しようとするため、遅延評価されるパスを使用することです。ユーザーにとっては、どちらも非常に同等に見えます。違いは、パーサー構造が 1 回だけ評価され、スラーパー パスがオンデマンドで評価される可能性があることです。オンデマンドは、ここでは「メモリ効率は高いが遅い」と読むことができます。最終的には、実行するパス/リクエストの数によって異なります。たとえば、XML の特定の部分の属性の値を知りたいだけで、それを処理したい場合でも、XmlParser はすべてを処理し、疑似 DOM でクエリを実行します。多くのオブジェクトが作成されるため、メモリと CPU が消費されます。XmlSlurper はオブジェクトを作成しないため、メモリと CPU を節約できます。

どちらもドキュメントの変換を行うことができますが、スラーパーはそれが定数であると想定しているため、最初に変更を書き出し、新しい xml を読み込むために新しいスラーパーを作成する必要があります。パーサーは、変更をすぐに確認することをサポートしています。

したがって、質問 (1) のユース ケースに対する答えは、XML 全体を処理する必要がある場合はパーサーを使用し、その一部のみを処理する場合はスラーパーを使用することです。API と構文は、実際にはそれほど重要ではありません。Groovy の人々は、これら 2 つのユーザー エクスペリエンスを非常に似たものにしようとしています。また、XML にインクリメンタルな変更を加える場合は、スラーパーよりもパーサーを使用することをお勧めします。

上記のイントロでは、よりメモリ効率の高い質問 (2) についても説明しています。とにかくすべてを読まない限り、スラーパーはパーサーかもしれませんが、違いがどれほど大きいかについての実際の数字はありません。

質問(3)もイントロで答えられます。複数の遅延評価されたパスがある場合は、再度評価する必要があります。これは、パーサーのように既存のグラフをナビゲートする場合よりも遅くなる可能性があります。そのため、使用状況によっては、パーサーが高速になる可能性があります。

したがって、(3a) ほとんどすべてのノード自体を読み取っても、大きな違いはありません。その場合、リクエストがより決定的な要因となるためです。ただし、(3b) の場合、いくつかのノードを読み取るだけでよい場合は、スラーパーの方が高速であると言えます。メモリ内に完全な構造を作成する必要がないため、それ自体ですでに時間とメモリが消費されます。

(3c) に関しては... 最近では、どちらも XML を更新/変換できます。実際には、変更する必要がある xml の部分の数に関連してより高速です。多くの部分がある場合はパーサーと言い、そうでない場合はスラーパーかもしれません。しかし、たとえば、slurper を使用して属性値を「Fred」から「John」に変更したい場合、後で同じ slurper を使用してこの「John」を照会するだけでは機能しません。

于 2011-10-01T16:46:47.487 に答える