Сбор результатов времени и пространства, произведенных макросом `time`?

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.

Есть ли способ собрать эти параметры и шаг за шагом поместить их в какой-нибудь стек или список и вернуть из функции?


person Sejwal    schedule 09.05.2014    source источник


Ответы (1)


Некоторые вещи являются стандартными: 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), вам нужно найти версии для конкретной реализации.

Вы также можете использовать with-timing - он предоставляет отчеты о ходе выполнения, включая ETA.

Между прочим, в вашем коде выделение памяти (make-array) затмевает length (что является доступом к слоту для массива).

person sds    schedule 09.05.2014
comment
Вместо моего кода я вызвал функцию (если мой подход верен), но ее говорящие переменные my-timings не имеют значения. - person Sejwal; 10.05.2014
comment
@Rorschach: вам нужно определить переменную *my-timings*, например. (defvar *my-timings*). - person Rörd; 11.05.2014
comment
@Rörd: я не знаю, почему у меня все еще не работает. - person Sejwal; 11.05.2014
comment
Вы сделали (defvar *my-timings* nil)? какое у вас сообщение об ошибке? - person sds; 11.05.2014
comment
@sds: я получаю сообщение SYSTEM::READ-EVAL-PRINT: переменная MY-TIMEINGS не имеет значения даже после того, как было установлено значение nil, как было предложено. - person Sejwal; 12.05.2014
comment
убедитесь, что вы определяете и используете одну и ту же переменную одну и ту же, т. е. обе имеют звездочки вокруг имени. - person sds; 12.05.2014