如何在Clojure中对函数进行基准testing?

我知道我可以花时间来评估一个函数可以使用时间函数/macros在屏幕上/标准输出打印出来。

时间macros返回评估函数的值,这使得它内联使用它很好。 不过,我想在特定情况下自动测量运行时间。

有没有一个函数返回一些库中的时间来帮助这个基准testing?

您可能想看看Hugo Duncan的Clojure – Criterium基准库。

从自述文件:

Criterium测量expression式的计算时间。 它旨在解决基准testing的一些缺陷,尤其是对JVM进行基准testing。

这包括:

  • 统计处理多个评估
  • 包括一个热身期,旨在让JIT编译器优化其代码
  • 在testing之前清除gc,以便在testing之前从GC状态中隔离时间
  • 在testing之后最后强制GC来估计清理对时间结果的影响

如果只是想要以编程方式捕获string,则可以在使用时间之前将* out *绑定到其他东西。

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

如果你想更好地控制格式,那么你可以使用Java的系统时间方法来创build你自己的时间版本,这就是macros在时刻使用的时间

 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的呼叫。

如果你为你的函数生成一个Java绑定(并且用一些Clojure Maven插件重新configuration),你甚至可以使用JMH( http://openjdk.java.net/projects/code-tools/jmh/ ),这可能是最好的JVM微型基准线束。 看看https://github.com/circlespainter/pulsar-auto-instrument-bench