3

Common Lisp 提供了一个time宏来找出一个表单需要多长时间执行,并将信息打印到跟踪输出:

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.

有没有办法收集这些参数并将它们逐步推送到某个堆栈或列表中并从函数中返回?

4

1 回答 1

3

有些东西是标准的:get-internal-run-timeget-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计数),你需要找到特定于实现的版本

您也可以考虑使用with-timing- 它提供包括 ETA 在内的进度报告。

顺便说一句,在您的代码中,内存分配 ( make-array) 相形见绌length(这是数组的插槽访问)。

于 2014-05-09T17:26:06.033 回答