Я знаю, что могу добраться, время берут для оценки функции, может быть распечатан на screen/stdout использование функции/макроса времени.
Макрос времени возвращает значение оцененной функции, которая делает большим использовать его встроенный. Однако я хочу автоматически измерить время выполнения при определенных обстоятельствах.
Существует ли функция, которая возвращает прошедшее время в некоторой библиотеке для помощи с этим сравнительным тестированием?
Вы можете изучить библиотеку тестирования производительности Hugo Duncan для Clojure - Criterium .
Из README:
Criterium измеряет время вычисления выражения. Он предназначен для устранения некоторых ловушек сравнительного анализа и, в частности, сравнительного анализа JVM.
Это включает:
- статистическую обработку нескольких оценок
- включение периода прогрева, разработанного, чтобы позволить JIT-компилятору оптимизировать свой код
- очистку gc перед тестированием, чтобы изолировать тайминги от состояния GC. перед тестированием
- последний принудительный сборщик мусора после тестирования для оценки воздействия очистки на результаты синхронизации
Если нужно просто программно захватить строку, вы можете привязать * out * к чему-то еще, прежде чем использовать time .
user=> (def x (with-out-str (time (+ 2 2))))
#'user/x
user=> x
"\"Elapsed time: 0.119 msecs\"\n"
Если вам нужен больший контроль над форматом, вы можете создать свою собственную версию time , используя методы системного времени Java, которые в любом случае используются в макросе time . :
user => (macroexpand '(time (+ 2 2)))
(let* [start__4197__auto__ (. java.lang.System (clojure.core/nanoTime))
ret__4198__auto__ (+ 2 2)]
(clojure.core/prn (clojure.core/str "Elapsed time: " (clojure.core//
(clojure.core/double
(clojure.core/- (. java.lang.System (clojure.core/nanoTime))
start__4197__auto__)) 1000000.0) " msecs"))
ret__4198__auto__)
Возьмите эту базовую структуру и замените вызов prn любым механизмом отчетности, который вы предпочитаете.