clojure benchmarking

¿Cómo se comparan las funciones en Clojure?



benchmarking (3)

Sé que puedo obtener el tiempo necesario para evaluar que una función se puede imprimir en la pantalla / stdout usando la función / macro de tiempo.

La macro de tiempo devuelve el valor de la función evaluada, lo que lo hace ideal para usarlo en línea. Sin embargo, quiero medir automáticamente el tiempo de ejecución bajo circunstancias específicas.

¿Hay alguna función que devuelva el tiempo transcurrido en alguna biblioteca para ayudar con esta evaluación comparativa?


Es posible que desee consultar la biblioteca de benchmarking de Hugo Duncan para Clojure - Criterium .

Del LÉAME:

Criterium mide el tiempo de cálculo de una expresión. Está diseñado para abordar algunas de las trampas de la evaluación comparativa, y la evaluación comparativa en la JVM en particular.

Esto incluye:

  • procesamiento estadístico de evaluaciones múltiples
  • inclusión de un período de calentamiento, diseñado para permitir que el compilador JIT optimice su código
  • purga de gc antes de la prueba, para aislar las temporizaciones del estado de GC antes de la prueba
  • un CG forzado final después de las pruebas para estimar el impacto de la limpieza en los resultados de sincronización


Si solo se trata de querer capturar la cadena mediante programación, puede vincular * out * a otra cosa antes de usar el tiempo .

user=> (def x (with-out-str (time (+ 2 2)))) #''user/x user=> x "/"Elapsed time: 0.119 msecs/"/n"

Si desea tener más control sobre el formato, puede crear su propia versión del tiempo utilizando los métodos de tiempo del sistema de Java, que es lo que la macro de tiempo usa de todos modos:

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__)

Tome esa estructura básica y reemplace la llamada a prn con cualquier mecanismo de informe que prefiera.