2012-05-10 8 views
2

私が正しく理解した場合、/は、そのノードの権利が、そのノードに残っているノードの直下の子でなければならないことを意味します。 /ul/liは、ドキュメントルートであるulアイテムの直接の子であるliアイテムを返します。 //ul//liは、文書のどこかにある任意のul項目の子孫であるli項目を返します。XPath:/ /より速く//?

Now:結果セットが同じであっても、より速く/ul/liですか?

答えて

3

一般的に言えば、はい、もちろんです!最も(number_of_ul * number_of_liノード)で

/ul/li訪問、2 //ul//liの最大深さと潜在的に文書内のすべてのノードを訪問する可能性があります。

しかし、ある種類の索引付け機能を備えた文書システムを使用している場合や、ノード数が同じになった文書などがある場合は、//が遅くないか、または/ul/liと同じ速度か、場合によってはさらに速くなります。いずれにしても、すべてのノードを訪問するスーパーダムのXPath実装を潜在的に持つ可能性があります。

具体的なシナリオは、どちらが速いのかを尋ねるのではなく、プロファイルする必要があります。 「それは依存している」という答えです。

2

おそらく少なくとも50個のXPathの実装があり、それらのパフォーマンスは数桁劇的に変化します。したがって、特定の実装を参照することなくXPathのパフォーマンスについて質問することは無意味です。

一般的には、/ a/b/c/dが// dよりも優れたパスを特定の方法で使用することを推奨します。しかし、このアドバイスは必ずしも正しいとは限りません。インデックスを作成する手間がかかっているため、より速く実行する製品があります。これは、XMLデータベースに対して実行している場合に特に当てはまります。また、パフォーマンスはすべてではありません。 FpMLのような複雑なボキャブラリを扱う場合、エレメントへの特定のパスは簡単に10ステップになります。名前は平均20文字です。したがって、200文字のXPathであり、間違ったときに見つけるのは非常に困難です。プログラマーのパフォーマンスは、マシンのパフォーマンスよりも重要です。

+0

精巧な答えをありがとう。私が使用している実装はDOMResultをドキュメントコンテナとして使用してAndroid(javax.xml.xpath.XPath)に同梱されています。私は好奇心を持っていました。なぜなら、 '' '' 'クエリは中程度のサイズのHTMLファイルを検索するときにはかなり遅く実行されているからです。 – manmal

+1

@manmal:したがって、測定を実行し、特定のXPath実装の答えを知っています。 Michael Kayが正しく説明しているように、これに答える正しい方法は測定によるものです。多くの異なるXPathエンジンで評価されるXPath式を使用する場合は、それらのうちのいくつか(またはほとんど)が '//'疑似演算子を最適化しない可能性があるため、確実に '/ /'を避けてください。 –

関連する問題