Как сравнить функций в Clojure?

Я знаю, что могу добраться, время берут для оценки функции, может быть распечатан на screen/stdout использование функции/макроса времени.

Макрос времени возвращает значение оцененной функции, которая делает большим использовать его встроенный. Однако я хочу автоматически измерить время выполнения при определенных обстоятельствах.

Существует ли функция, которая возвращает прошедшее время в некоторой библиотеке для помощи с этим сравнительным тестированием?

40
задан Peter Tillemans 16 June 2010 в 10:38
поделиться

2 ответа

Вы можете изучить библиотеку тестирования производительности Hugo Duncan для Clojure - Criterium .

Из README:

Criterium измеряет время вычисления выражения. Он предназначен для устранения некоторых ловушек сравнительного анализа и, в частности, сравнительного анализа JVM.

Это включает:

  • статистическую обработку нескольких оценок
  • включение периода прогрева, разработанного, чтобы позволить JIT-компилятору оптимизировать свой код
  • очистку gc перед тестированием, чтобы изолировать тайминги от состояния GC. перед тестированием
  • последний принудительный сборщик мусора после тестирования для оценки воздействия очистки на результаты синхронизации
27
ответ дан 27 November 2019 в 01:46
поделиться

Если нужно просто программно захватить строку, вы можете привязать * 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 любым механизмом отчетности, который вы предпочитаете.

31
ответ дан 27 November 2019 в 01:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: