首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何提高Xquery循环转换的性能

如何提高Xquery循环转换的性能
EN

Stack Overflow用户
提问于 2013-09-13 17:36:51
回答 4查看 586关注 0票数 2

我在Xquery中使用了一种特殊的方法,如下所示

代码语言:javascript
运行
复制
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占用的时间最长。在这种情况下,如何提高性能?请帮帮忙

EN

回答 4

Stack Overflow用户

发布于 2013-09-13 17:46:33

我不太明白为什么要构造一个与从$node获得的名称相同的新属性并插入@id的值。由于使用元素的构造应该会有一些开销,所以我猜下面的方法会更快(并且应该提供相同的输出):

代码语言:javascript
运行
复制
declare function ctrlv($node, $node-id as xs:string) 
{
    <z:b> 
      {$node/@xml:id}
    </z:b>
};

此外,$node-id从未在您的函数中使用过,因此您可能希望将其作为参数删除。

票数 2
EN

Stack Overflow用户

发布于 2013-09-13 21:26:16

有一些渐进的步骤来提高这些东西的速度。创建XML元素的代价有点高(尽管.3 ms并没有那么糟糕……但如果你做了其中的10k,它就会加起来)

以下是识别最常用表达式的一些步骤。它们是关于在发现性能问题之后要做什么的建议,而不是之前的建议,因为通常性能影响最小,代码的可读性和可维护性更重要。但是一旦你确定了一个热点,可以考虑以下几点:

限制函数调用-这样简单的事情可以在没有函数的情况下内联完成。限制变量绑定限制循环限制元素和属性的动态构造

当然,你不可能做到所有这些,但你可以决定哪里是最痛苦的,并在那里应用这些概念。例如,上面的调用可以内联为

代码语言:javascript
运行
复制
<z:b xml:id="{$node/@xml:id}"/>

试着把这个内联放在你尝试函数的地方,看看结果是什么。

还要注意,分析器有时会给出误导性的信息。许多表达式被懒惰地计算,并且倾向于将它们的时间归因于它们被使用的地方,而不是它们被声明的地方。

票数 1
EN

Stack Overflow用户

发布于 2013-09-13 23:19:22

你的电脑是不是特别慢?分析器告诉我这在250毫秒内运行。

代码语言:javascript
运行
复制
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次,但得到该表达式的速度会更快一些。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18782992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档