0

サイズ 4 mb の xml ファイルで C プログラムを使用していくつかの XPath クエリを実行しようとしています。また、スループット (xml ファイルのサイズを、xml ファイルの解析にかかった時間とクエリの実行にかかった時間で割ったもの) も計算しています。次の XPath 式を実行すると:

「//何|//それは//あれ」

..約 700 メガビット/秒のスループットが得られます。しかし、次に次の式を実行すると:

「何|//それは//あれ」

...約 36 メガビット/秒のスループットが得られます。2 番目のクエリの先頭にある 2 つの二重スラッシュを削除すると、スループットが大幅に低下する理由を説明できる人はいますか? 助けていただければ幸いです。

4

1 に答える 1

0

XPathに追加//するということは、「ルートから開始し、ドキュメント内のすべてのノードで次の条件を確認する」ことを意味します。これを削除すると、現在のノードのみをチェックすることが期待されます。

例:

<root>
    <A>
    </A>
    <D position="I'm here">
        <B>I'm inside D!</B>
        <C>So am I!</C>
    </D>
    <B>I'm not inside D.</B>
    <C>I'm not either.</C>
</root> 

ここでXPathを適用する//Cと、結果は次のようになります。

<C>So am I!</C>

<C>I'm not either.</C>

しかし、XPathを適用するCと、結果は<C>So am I!</C>

//したがって、同じ結果が得られたとしても、を適用してドキュメント全体を検索しています。を使用するだけwhat|//is//thatで、XPathがその名前の現在のノードの子を見つけられない場合、検索を停止します。、、、および//what|//is//thatすべてのノードを探しているisので、時間がかかります。thatwhat

効率が心配な場合は、できるだけ正確なパスを使用してください(例:root/A/D/Cの代わりに//C

于 2013-01-10T19:51:13.120 に答える