Common Lisp提供了一个time
宏来查找表单执行的时间,并将信息打印到跟踪输出:
time评估当前环境中的表单(词法和动态)。 ... 时间打印各种计时数据和其他信息以跟踪输出。 印刷信息的性质和格式是 实现定义。鼓励实施提供此类服务 实时,机器运行时间和存储的信息 管理统计。
例如:
(time (length (make-array 1000000)))
Real time: 0.0140014 sec.
Run time: 0.0 sec.
Space: 4000008 Bytes
GC: 1, GC time: 0.0 sec.
有没有办法收集这些参数并将它们逐步推入某个堆栈或列表并从函数中返回?
答案 0 :(得分:3)
有些事情是标准的:get-internal-run-time和get-internal-real-time:
(defvar *my-timings* nil)
(let ((run (get-internal-run-time))
(real (get-internal-real-time)))
(multiple-value-prog1 (my-code)
(push (cons (- (get-internal-run-time) run)
(- (get-internal-real-time) real))
*my-timings*)))
其他不是(空间和GC计数),您需要找到implementation-specific versions。
您也可以考虑使用with-timing
- 它提供进度报告,包括ETA。
顺便提一下,在您的代码中,内存分配(make-array
)相形见绌length
(这是数组的插槽访问)。