XQuery-记录REST调用或方法调用所花费的时间

XQuery-记录REST调用或方法调用所花费的时间,xquery,marklogic,Xquery,Marklogic,我们正在对应用程序进行微调,我正在找出方法调用之间的时间差。该方法可以是函数调用或rest进程 let $x := fn:current-time() let $re := xdmp:http-post('http://www.somerestdomain.com',()) let $y := fn:currrent-time() return $x - $y or let $x := fn:current-time() let $re := domain:call-some-long-ru

我们正在对应用程序进行微调,我正在找出方法调用之间的时间差。该方法可以是函数调用或rest进程

let $x := fn:current-time()
let $re := xdmp:http-post('http://www.somerestdomain.com',())
let $y := fn:currrent-time()
return $x - $y

or

let $x := fn:current-time()
let $re := domain:call-some-long-running-function()
let $y := fn:currrent-time()
return $x - $y
分析这一点可以让我看到XQuery引擎优化了
fn:current-time()
调用,并始终将$x和$y指定为相同的值

我发现了这个示例代码,它也有一些与MarkLogic相关的问题

我们使用的是MarkLogic Xml数据库,上面提到的伪代码是MarkLogic API

有什么方法可以找出XQuery超时吗?

MarkLogic使用,基本上这意味着每个事务将时钟增加1个周期。由于$x和$y在同一事务中,因此您将始终返回相同的时间戳

尝试以下诊断功能

(xdmp:http-get("http://www.marklogic.com"), xdmp:query-meters())
这将返回查询结果和查询中的一些诊断信息。你的情况是这样的

(xdmp:http-post('http://www.somerestdomain.com',()), xdmp:query-meters())

使用
xdmp:appeased-time()
而不是
current-time()
,如果我没有弄错的话,这是4.2中引入的一个新函数

正如Scott和上面的评论所解释的那样,
current-time()
是稳定的,并且在一次运行中会返回相同的值,除非您使用
xdmp:eval()
,但这只会大大降低代码的速度


除此之外,还有一种从查询中获取计时信息的通用方法。最简单的方法是将相关代码的一部分复制到CQ(),然后点击其中的
Profile
按钮。在使用概要文件库()中的函数的引擎盖下()。它们返回一个包含大量计时信息的html表。对于优化MarkLogic Server中的代码非常有价值。

是:核心库中的大多数函数都具有这样的属性,即在一个·执行范围·内使用相同的参数调用相同的函数两次会返回相同的结果:这些函数被认为是稳定的。这是一个很好的指针,谢谢。嗨,Scott。很高兴知道答案。事实上,我们是按照marklogic顾问的建议使用查询仪表的。在每一个瓶颈函数调用中应用查询表将很容易产生代码。是否有任何通用方法来启用/禁用此功能???我建议查看(阅读第26页)。它将提供一些关于如何优化应用程序以获得最佳性能的一般指导原则。基本上,您希望隔离您怀疑长时间运行的查询,然后在CQ中运行它们进行分析。我认为没有办法禁用查询仪表。它用于隔离查询并单独运行它们。但请咨询顾问确保。注意在生产代码中调用
xdmp:query meters
:调用该函数可能需要一些时间进行一些查询。正如grtjn提到的,
xdmp:appeased time
是一种更干净的方法。