2011-03-08 51 views
3

我们正在调用微调我们的应用程序和我正在查找方法调用之间的时间差。该方法可以是函数调用或休息过程。XQuery - 通过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为相同的值。

我发现它也有一些问题WRT到MarkLogic http://en.wikibooks.org/wiki/XQuery/Uptime_monitor

我们使用MarkLogic XML数据库和伪代码上述指MarkLogic API

此示例代码有没有办法找到出XQuery TimeOut?

+2

['current-time()'](http://www.w3.org/TR/xquery-operators/#func-current-time)[stable](http://www.w3.org)/TR/xquery-operators /#stable):_核心库中的大部分函数都具有在执行范围内两次调用同一个函数的属性·使用相同的参数返回相同的结果:这些函数被称为* *稳定** ._ – 2011-03-08 19:01:55

+0

这是一个伟大的指针,谢谢。 – kadalamittai 2011-03-08 20:50:58

回答

2

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

请尝试以下诊断功能。

(xdmp:http-get("http://www.marklogic.com"), xdmp:query-meters()) 

这将返回您的查询结果和您的查询的一些诊断信息。在你的情况下,它会是这样..

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

嗨斯科特。很高兴知道答案。事实上,根据我们的marklogic顾问的建议,我们正在使用查询表。在每一瓶瓶颈函数调用中应用查询计量表将是易于代码的。有没有任何通用的方式来启用/禁用此功能? – kadalamittai 2011-03-08 20:52:29

+0

我推荐查看[查询性能和调优指南](http://developer.marklogic.com/pubs/4.2/books/performance.pdf)(阅读第26页)。它将有一些关于如何调整应用程序以获得最佳性能的一般指导。本质上,你想隔离你怀疑是长时间运行的查询,然后在CQ中运行它们进行分析。 – Scott 2011-03-09 00:55:59

+0

我不认为有一种方法来禁用查询米。它旨在隔离查询并单独运行它们。但请咨询您的顾问以确保。 – Scott 2011-03-09 00:59:56

3

使用xdmp:elapsed-time()代替current-time(),在4.2推出,如果我没有记错了新的功能。

正如Scott解释和上述评论current-time()是稳定的,并会在一次运行中返回相同的值,除非您会诉诸于使用xdmp:eval(),但那只会让您的代码变得更慢。

在此旁边,一种通用的方式,可以从您的查询中获取计时信息。最简单的方法是将相关代码的一部分复制到CQ(http://developer.marklogic.com/code/cq)中,并点击其中的Profile按钮。在使用配置文件库(http://developer.marklogic.com/pubs/5.0/apidocs/ProfileBuiltins.html)功能的引擎盖下。这些返回一个包含大量计时信息的html表格。在MarkLogic Server中优化代码非常有价值。