40 votes

Comment évaluer les fonctions dans Clojure?

Je sais que je peux obtenir le temps nécessaire pour évaluer une fonction et l’imprimer sur l’écran / la sortie standard à l’aide de la fonction / macro temps.

La macro time renvoie la valeur de la fonction évaluée, ce qui rend son utilisation en ligne intéressante. Cependant, je veux mesurer automatiquement le temps d'exécution dans des circonstances spécifiques.

Existe-t-il une fonction qui renvoie le temps écoulé dans une bibliothèque pour faciliter l'analyse comparative?

31voto

Greg Points 4537

Si c'est juste une question de vouloir capturer la chaîne de la programmation, vous pouvez lier *out* à quelque chose d'autre avant de l'utiliser de temps.

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

Si vous voulez plus de contrôle sur le format, alors vous pouvez créer votre propre version de temps à l'aide de Java du Système de temps, des méthodes, c'est ce que le temps de la macro utilise sous le capot de toute façon:

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

Prendre que la structure de base et remplacer l'appel à la prn avec ce mécanisme de présentation de rapports que vous préférez.

27voto

Michał Marczyk Points 54179

Vous voudrez peut-être regarder dans Hugo Duncan analyse comparative de la bibliothèque pour Clojure -- Critérium.

Depuis le README:

Critérium des mesures le temps de calcul d'une expression. Il est conçu pour répondre à certains des pièges de l'analyse comparative et l'évaluation de la JVM en particulier.

Cela comprend:

  • le traitement statistique des données de plusieurs évaluations
  • l'inclusion d'une période d'échauffement, conçu pour permettre au compilateur JIT pour optimiser son code
  • la purge de la cg avant de tester, pour isoler les timings de GC état avant le test
  • une finale forcé GC après des tests pour estimer l'impact de l'opération de nettoyage sur le calendrier résultats

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X