首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Microbenchmark Clojure函数

Microbenchmark Clojure函数
EN

Stack Overflow用户
提问于 2014-04-04 15:43:42
回答 3查看 728关注 0票数 5

问题

assoc这样的小型Clojure函数有多快?我怀疑assoc在100 it到3 3us的范围内运行,这使得时间变得很困难。

使用time

代码语言:javascript
复制
user=> (def d {1 1, 2 2})
#'user/d
user=> (time (assoc d 3 3))
"Elapsed time: 0.04989 msecs"
{1 1, 2 2, 3 3}

那里显然有很多开销,所以我不相信这个基准。朋友们向我介绍了黄曲霉,它处理了很多基准测试的痛苦(多个评估,热身JVM,GC见如何在Clojure中对函数进行基准测试?)。

使用Criterium

可悲的是,在这么小的基准上,连Criterium似乎都失败了。

代码语言:javascript
复制
user=> (use 'criterium.core)
nil
user=> (def d {1 1 2 2})
#'user/d
user=> (bench (assoc d 3 3))
WARNING: JVM argument TieredStopAtLevel=1 is active, and may lead to unexpected results as JIT C2 compiler may not be active. See http://www.slideshare.net/CharlesNutter/javaone-2012-jvm-jit-for-dummies.
WARNING: Final GC required 1.694448681330372 % of runtime
Evaluation count : 218293620 in 60 samples of 3638227 calls.
             Execution time mean : -15.677491 ns
    Execution time std-deviation : 6.093770 ns
   Execution time lower quantile : -20.504699 ns ( 2.5%)
   Execution time upper quantile : 1.430632 ns (97.5%)
                   Overhead used : 123.496848 ns

万一你错过了,这个手术平均要花费15 on。我知道Clojure非常神奇,但是消极的运行时看起来太好了,不可能是真的。

重复这个问题

那么,一个assoc需要多长时间呢?如何在Clojure中对微操作进行基准测试?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-06 02:55:22

为什么不把它包装成一个循环并重新命名呢?

在我的硬件上

代码语言:javascript
复制
(bench (dotimes [_ 1000] (assoc d 3 3)))

的平均执行时间约为

代码语言:javascript
复制
(bench (assoc d 3 3))

即,在第一种情况下,大约有100 s,在第二种情况下,大约有100 ns。如果您的单个assoc是Criterium的“噪音”,您可以尝试用同样的方式包装它,并且非常接近“内在”值。((dotimes [_ 1000] 1)时钟在.59 s,因此循环本身带来的额外开销相对较小。)

票数 5
EN

Stack Overflow用户

发布于 2014-04-04 16:31:36

Criterium由于其自身的测量,试图将间接费用网起来。这可能导致快速函数的负面结果。请参阅自述的测量开销估计部分。你的开销高得令人怀疑。您可以运行(estimatated-overhead!) sic几次以获取更精确的开销数字。

票数 5
EN

Stack Overflow用户

发布于 2014-04-04 16:26:48

安迪·芬格赫特( Andy )将其中的一些东西保存了一段时间。

  • 家庭- http://jafingerhut.github.io/clojure-benchmarks-results/Clojure-benchmarks.html
  • 结果- http://jafingerhut.github.io/clojure-benchmarks-results/Clojure-expression-benchmark-graphs.html

ClojureScript:

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22867291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档