如何在Clojure中对函数进行基准测试?
我知道我可以通过时间函数/宏在屏幕/标准输出上获得评估函数所需的时间 time宏返回已计算函数的值,这使得内联使用它非常好。但是,我想在特定情况下自动测量运行时如何在Clojure中对函数进行基准测试?,clojure,benchmarking,Clojure,Benchmarking,我知道我可以通过时间函数/宏在屏幕/标准输出上获得评估函数所需的时间 time宏返回已计算函数的值,这使得内联使用它非常好。但是,我想在特定情况下自动测量运行时 是否有一个函数可以返回某个库中经过的时间来帮助进行基准测试?如果只是想通过编程方式捕获字符串,可以在使用时间之前将*out*绑定到其他对象 如果希望对格式进行更多控制,则可以使用Java的系统时间方法创建自己的时间版本,这也是time宏在后台使用的方法: user => (macroexpand '(time (+ 2 2)))
是否有一个函数可以返回某个库中经过的时间来帮助进行基准测试?如果只是想通过编程方式捕获字符串,可以在使用时间之前将*out*绑定到其他对象 如果希望对格式进行更多控制,则可以使用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的调用。您可能需要查看雨果·邓肯的Clojure基准库-- 自述文件: Criteriam度量表达式的计算时间。它旨在解决基准测试的一些缺陷,特别是在JVM上进行基准测试 这包括:
- 多重评价的统计处理
- 包括预热期,旨在允许JIT编译器优化其代码
- 测试前吹扫gc,以在测试前将计时与gc状态隔离
- 测试后的最终强制GC,以估计清理对计时结果的影响
如果为函数生成Java绑定(并进行Clojure Maven插件重新配置),甚至可以使用JMH(),这可能是最好的JVM微基准标记工具。看一看谢谢,我也是从这个开始看的。这个标准库真的很合适。但是除非你知道Haskell库,否则你不会在谷歌上无意中被它绊倒。@PeterTillemans好吧,现在我们知道了,因为StackOverflow中提到了它。:-)我不这么认为,这个问题是关于外部基准测试的,这个问题更多的是关于测试代码。我必须承认我很惊讶有人在5年前的问题中寻找重复的问题。
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__)