2010-06-14 65 views
40

我知道我可以花时间评估一个函数可以使用时间函数/宏在屏幕上/标准输出打印出来。如何在Clojure中对函数进行基准测试?

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

是否有一个函数可以返回某个库中的已用时间以帮助进行基准测试?

+0

可能的重复[分析工具为Clojure?](http://stackoverflow.com/questions/2974916/profiling-tool-for-clojure) – 2015-04-04 02:56:59

+0

我不这么认为,提到的问题是关于外部基准测试,这个问题更多的是关于如何使用代码。我必须承认有人在5年前的问题中寻找重复的东西感到惊讶。 – 2015-04-13 12:26:34

回答

27

您可能想看看Hugo Duncan的Clojure基准图书馆 - Criterium

自述:

绕圈措施表达式的计算时间。它旨在解决基准测试的一些缺陷,尤其是针对JVM的基准测试。

这包括:

  • 多种评估的统计处理
  • 列入一个预热时间,设计为允许JIT编译器测试之前优化它的代码
  • 吹扫GC的,以分离测试前来自GC状态的时间
  • 测试后最终强制GC以估计清除对时间结果的影响
30

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

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

如果你想在格式更多的控制,那么你可以创建自己的时间版本使用Java的系统时间的方法,这是引擎盖下的时间宏观用途反正:

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

+4

+1使用macroexpand在引擎盖下进行挖掘! – mikera 2010-06-15 00:57:14

+1

谢谢,我也是从这个开始看这个。标准库真的适合这项法案。但除非你知道Haskell库,否则你不会偶然使用谷歌偶然发现它。 – 2010-06-15 05:58:27

+1

@PeterTillemans嗯,我们现在是,因为它在StackOverflow中提到。 :-) – 2013-12-05 18:57:44

相关问题