我想知道查询执行的时间。我计划将其记录下来用于审计和支持目的。
我在文档中找到了这个:
q)\t log til 100000 / milliseconds for log of first 100000 numbers
3
但是上面的方法实际上会再次评估查询并告诉我们时间。它不会返回查询结果。因此,如果我使用它,它实际上就像运行每个查询两次,一次用于获取结果,一次用于了解执行时间。
有人知道其他任何方法吗?
答案 0 :(得分:3)
您还可以捕获查询运行之前/之后的时间以确定执行时间。
执行一行:
q)start:.z.p;result:log til 100000;exectime:.z.p-start
q)exectime
0D00:00:00.297268000
q)result
-0w 0 0.6931472 1.098612 1.386294 ...
此方法将为您提供纳秒精度,但可以轻松调整以返回与\t
相同的效果。
q)res:system"t a:{st:.z.p;log til 10000000;.z.p-st}[]"
q)`long$`time$a /convert to Ms
297
q)res
297
答案 1 :(得分:2)
您可以使用"系统t"调用(相当于\ t)来一次性存储结果和时间。
b:system"t a:log til 100000"
虽然它不是很通用或功能,但它可能不适合你在字符串中包含命令的需要。
答案 2 :(得分:1)
扩展Connor的想法,你可以将它包装在一个函数中,该函数将返回值并打印stdout所需的时间:
time:{ t0:.z.t; r:eval x; 0N!.z.t-t0; :r }
然后发送函数的parse tree作为参数:
q)a:time (log;til 100000)
00:00:00.003
q)a
-0w 0 0.6931472 1.098612 1.386294 1.609438 1.791759 1.94591 2.079442 2.197225..