В lisp, как я могу измерить и зафиксировать время, потраченное на оценку выражения? - PullRequest
7 голосов
/ 16 февраля 2011

Я хочу захватить результаты вызова макроса time, чтобы собрать несколько измерений и обработать их. Я попытался локально setf стандартный вывод и перенаправить его на строку, но он не работал с макросом time. Может быть, это неправильно, но я попробовал:

(with-output-to-string (str)
    (let ((*standard-output* str))
        (time (test-with-size 40))))

Вопросы:

  1. Можно ли захватить вывод time?
  2. Если нет, могу ли я зафиксировать вывод команды slime-profile-report?
  3. Если ничего из вышеперечисленного не работает, как я могу измерить время, потраченное на оценку произвольного выражения?

Что я хочу сделать, это измерить время выполнения алгоритма по мере увеличения размера входных данных, поэтому для каждого входного размера (в диапазоне от 1 до 100) я буду измерять много раз и сохраню среднее значение. Тогда я хочу представить результаты. Составлять графики легко, и я нашел много способов в Cliki, но как я могу собрать результаты?

Я использую CLISP и CCL.

EDIT: Пол Натан указал, что макрос time выводит на *trace-output*, что является решением. Я хотел бы получить более хорошее, более простое решение, потому что с этим я должен проанализировать трассировку, специфичную для реализации.

1 Ответ

9 голосов
/ 16 февраля 2011

Если вы хотите захватить текст, вам нужно использовать правильный поток.Стандарт ANSI CL гласит, что TIME печатает для отслеживания вывода.

Так что это даст вам текст в виде строки.

(with-output-to-string (*trace-output*)
  (time (sin 40.0)))

Вы также можете написать свой собственный макрос, используя примитивы времени.См. 25.1.4.3 Внутреннее время для получения числовых данных.

...