XPath 使用時のパフォーマンスの問題について質問があります。
どちらが優れているのか、その理由は? (もちろんパフォーマンスの場合):
//A/B/C[@id="x"]/../..
対。
//A[B/C[@id="x"]]
XPath 使用時のパフォーマンスの問題について質問があります。
どちらが優れているのか、その理由は? (もちろんパフォーマンスの場合):
//A/B/C[@id="x"]/../..
対。
//A[B/C[@id="x"]]
どちらかといえば、使用するとパフォーマンスが低下します...プロセッサはそのような式を最適化せず、要求されているため、要素の子孫として要素を//
探すのに時間を無駄にする可能性があります。私はこれを、XSLT 処理のパフォーマンス低下の最も一般的な原因の 1 つとして教室で強調しています (StackOverflow の質問で悪用されているのを見るたびにうんざりしますが、非常に頻繁に使用されるため、一日中話し合っていました)。 .A
C
A/B/C[@id='x']/../..
との違いについてはA[B/C[@id="x"]]
、プロセッサが最適化の一環として前者を後者に書き換えるかどうかによって異なります (宣言型であるため)。
そのような最適化が行われない場合、前者は後者よりも遅くなります。前者はプロセッサに時間をかけてすべてのC
要素を収集し、それぞれの祖父母要素を結合するツリーをバックアップするように求めているからです。後者の式は、ノード セットであるデータ型のブール値 true()/false() テストである述語を使用し、プロセッサは、返されるブール値がそのようなデータ型の最初の検出で true() であることを認識します。C
要素であり、他の要素を探す必要はありませんC
(他の要素を探すべきではありませんC
)。