问题
像assoc这样的小型Clojure函数有多快?我怀疑assoc在100 it到3 3us的范围内运行,这使得时间变得很困难。
使用time
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似乎都失败了。
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中对微操作进行基准测试?
发布于 2014-04-06 02:55:22
为什么不把它包装成一个循环并重新命名呢?
在我的硬件上
(bench (dotimes [_ 1000] (assoc d 3 3)))的平均执行时间约为
(bench (assoc d 3 3))即,在第一种情况下,大约有100 s,在第二种情况下,大约有100 ns。如果您的单个assoc是Criterium的“噪音”,您可以尝试用同样的方式包装它,并且非常接近“内在”值。((dotimes [_ 1000] 1)时钟在.59 s,因此循环本身带来的额外开销相对较小。)
发布于 2014-04-04 16:31:36
Criterium由于其自身的测量,试图将间接费用网起来。这可能导致快速函数的负面结果。请参阅自述的测量开销估计部分。你的开销高得令人怀疑。您可以运行(estimatated-overhead!) sic几次以获取更精确的开销数字。
发布于 2014-04-04 16:26:48
安迪·芬格赫特( Andy )将其中的一些东西保存了一段时间。
ClojureScript:
https://stackoverflow.com/questions/22867291
复制相似问题