问题
像assoc
这样的小型Clojure函数有多快?我怀疑assoc
的操作速度在100纳秒到3微秒之间,这使得计时变得困难。
使用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}
显然这个基准测试中有很多开销,所以我不信任它。朋友们向我指出了Criterium,它处理了许多基准测试的痛点(多次评估、JVM预热、垃圾回收,请参见如何在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纳秒。我知道Clojure非常神奇,但负运行时间似乎太好了。
重复问题
那么,assoc
需要多长时间?如何在Clojure中对微操作进行基准测试?
assoc
的性能。我对哈希映射在结构共享和复制编辑下的性能很感兴趣。 - MRocklin