Събиране на резултатите за време и пространство, произведени от макроса „време“?

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.

Има ли начин да съберете тези параметри и да ги избутате стъпка по стъпка в някакъв стек или списък и да го върнете от функция?


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-code извиках функция (ако подходът ми е правилен), но нейните променливи 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-TIMEGS няма стойност дори след като я задам на нула, както е предложено. - person Sejwal; 12.05.2014
comment
моля, уверете се, че дефинирате и използвате една и съща променлива, т.е. и двете имат звезди около името. - person sds; 12.05.2014