Как тестировать функции в Clojure? - PullRequest
40 голосов
/ 15 июня 2010

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

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

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

Ответы [ 3 ]

31 голосов
/ 15 июня 2010

Если вам нужно просто захватить строку программным способом, вы можете * привязать * к чему-то другому, прежде чем использовать время .

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

27 голосов
/ 15 июня 2010

Возможно, вы захотите заглянуть в сравнительную библиотеку Хьюго Дункана для Clojure - Критерий .

Из README:

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

Это включает в себя:

  • статистическая обработка нескольких оценок * включение 1013 *
  • периода прогрева, предназначенного для того, чтобы компилятор JIT мог оптимизировать свой код
  • очистка gc перед тестированием, чтобы изолировать временные характеристики от состояния GC до тестирования
  • окончательный принудительный сборщик мусора после тестированияоценить влияние очистки на временные результаты
0 голосов
/ 07 марта 2015

Если вы генерируете Java-привязку для своих функций (и с некоторой реконфигурацией плагина Clojure Maven), вы даже можете использовать JMH (http://openjdk.java.net/projects/code-tools/jmh/), который, вероятно, является лучшим жгутом для микробенчмаркинга JVM. Посмотрите на https://github.com/circlespainter/pulsar-auto-instrument-bench

...