我在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占用的时间最长。在这种情况下,如何提高性能?请帮帮忙
发布于 2013-09-13 17:46:33
我不太明白为什么要构造一个与从$node
获得的名称相同的新属性并插入@id
的值。由于使用元素的构造应该会有一些开销,所以我猜下面的方法会更快(并且应该提供相同的输出):
declare function ctrlv($node, $node-id as xs:string)
{
<z:b>
{$node/@xml:id}
</z:b>
};
此外,$node-id
从未在您的函数中使用过,因此您可能希望将其作为参数删除。
发布于 2013-09-13 21:26:16
有一些渐进的步骤来提高这些东西的速度。创建XML元素的代价有点高(尽管.3 ms并没有那么糟糕……但如果你做了其中的10k,它就会加起来)
以下是识别最常用表达式的一些步骤。它们是关于在发现性能问题之后要做什么的建议,而不是之前的建议,因为通常性能影响最小,代码的可读性和可维护性更重要。但是一旦你确定了一个热点,可以考虑以下几点:
限制函数调用-这样简单的事情可以在没有函数的情况下内联完成。限制变量绑定限制循环限制元素和属性的动态构造
当然,你不可能做到所有这些,但你可以决定哪里是最痛苦的,并在那里应用这些概念。例如,上面的调用可以内联为
<z:b xml:id="{$node/@xml:id}"/>
试着把这个内联放在你尝试函数的地方,看看结果是什么。
还要注意,分析器有时会给出误导性的信息。许多表达式被懒惰地计算,并且倾向于将它们的时间归因于它们被使用的地方,而不是它们被声明的地方。
发布于 2013-09-13 23:19:22
你的电脑是不是特别慢?分析器告诉我这在250毫秒内运行。
declare function local:do($node)
{
element b { $node/@xml:id }
};
distinct-values(
(1 to 10 * 1000) ! local:do(<test xml:id="a123"/>))
另一件可以尝试的事情是XSLT实现。您仍然需要对$node/@xml:id
求值11,000次,但得到该表达式的速度会更快一些。
https://stackoverflow.com/questions/18782992
复制相似问题