Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Clojure中对函数进行基准测试?_Clojure_Benchmarking - Fatal编程技术网

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

如何在Clojure中对函数进行基准测试?,clojure,benchmarking,Clojure,Benchmarking,我知道我可以通过时间函数/宏在屏幕/标准输出上获得评估函数所需的时间 time宏返回已计算函数的值,这使得内联使用它非常好。但是,我想在特定情况下自动测量运行时 是否有一个函数可以返回某个库中经过的时间来帮助进行基准测试?如果只是想通过编程方式捕获字符串,可以在使用时间之前将*out*绑定到其他对象 如果希望对格式进行更多控制,则可以使用Java的系统时间方法创建自己的时间版本,这也是time宏在后台使用的方法: user => (macroexpand '(time (+ 2 2)))

我知道我可以通过时间函数/宏在屏幕/标准输出上获得评估函数所需的时间

time宏返回已计算函数的值,这使得内联使用它非常好。但是,我想在特定情况下自动测量运行时


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

如果只是想通过编程方式捕获字符串,可以在使用时间之前将*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__)