2

以下に示すように、Xqueryで特定のメソッドを使用しています

declare function ctrlv($node, $node-id as xs:string) 
{
    <z:b> 
    {
        (attribute {"xml:id"}{$node/@xml:id})
      }</z:b>
};

この特定の関数は、diff $node を使用して 11,000 回ループします。指定されたメソッドだけで、応答時間全体の 50 ~ 60% (約 8 秒) かかります。パフォーマンス プロファイリングを実行すると、$node/@xml:id に最大の時間がかかることが示されました。この場合、パフォーマンスを改善するにはどうすればよいですか? 助けてください

4

4 に答える 4

2

$nodeの値を取得して挿入するのと同じ名前で新しい属性を構築する理由がよくわかりません@id。要素の構築を使用するとオーバーヘッドが発生するはずなので、次のほうが高速であると思います(同じ出力が得られるはずです)。

declare function ctrlv($node, $node-id as xs:string) 
{
    <z:b> 
      {$node/@xml:id}
    </z:b>
};

また、$node-id関数では決して使用されないため、引数として削除することをお勧めします。

于 2013-09-13T09:46:32.763 に答える
1

There are incremental steps to improving speed of these things. Creation of XML elements is somewhat expensive (although .3 ms is not that bad ... but if you do 10k of those it does add up)

Here are some steps when you identify the most frequenly used expressions. They are suggestions of what to do after you identify performance issues, not before, because most often the performance impact is minimal and code readability and maintainability is more important. But once you identify a hot spot consider these:

limit function calls - something this simple can be done inline without a function. Limit binding to variables Limit for loops Limit dynamic construction of elements and attributes

Of course you cant do all of these but you can decide where the pain is most and apply the concepts there. For example the above call could instead be inlined as

<z:b xml:id="{$node/@xml:id}"/>

Try placing this inline where you tried the function and see what the results are.

Also note that the profiler can sometimes give misleading information. Many expressions are lazily evaluated and tend to attribute their time to where they are used instead of where they are declared.

于 2013-09-13T13:26:16.100 に答える
0

あなたのコンピュータは特に遅いですか?プロファイラーによると、これは 250 ミリ秒で実行されます。

declare function local:do($node) 
{
  element b { $node/@xml:id }
};

distinct-values(
  (1 to 10 * 1000) ! local:do(<test xml:id="a123"/>))

もう 1 つ試すことは、XSLT の実装です。それでも 11,000 回評価する必要がありますが$node/@xml:id、その式にたどり着くのは少し速くなります。

于 2013-09-13T15:19:22.433 に答える
-2

変更したドキュメントを同じ URI でデータベースに書き戻す場合は、メモリ内に新しいドキュメント ツリーを構築してデータベースに書き戻す代わりに、 xdmp:node-replace() 関数を使用して属性値をその場で変更してみてください。 .

そうでない場合、ループで何が起こりますか? 反復ごとに新しいドキュメントを構築していますか?それとも、イテレータがタイプスイッチを使用してツリーを再帰し、新しい属性とその祖先要素を構築しますが、他のすべてのノードをコピーしますか?

于 2013-09-13T14:05:35.140 に答える