如之前在
https://github.com/ztellman/immutable-int-map/pull/1中讨论
我注意到现有的Seq实现不是惰性的,因此我在此基础上实现了一个基本的逆迭代器,而不是直接遍历树的最右分支 - 我实际上非常惊讶核心Clojure没有为ArrayList提供Reversible。
补丁从
https://github.com/glenjamin/data.int-map/tree/rseq获取,以下为基准测试
user=> (require '[clojure.data.benchmark :refer (entries)])
#_=> '[clojure.data.int-map :as i]
#_=> '[criterium.core :as c])
nil
user=>
user=> (let [m (into (i/int-map) entries)]
#_=> (println "seq")
#_=> (c/quick-bench (dorun (seq m)))
#_=> (println "rseq")
#_=> (c/quick-bench (dorun (rseq m))))
seq
警告:最后GC需要的运行时间占比为8.9263203426305%
警告:最后GC需要的运行时间占比为48.03202811726098%
评估计数:12个,抽样6次,每次调用2次。
执行时间平均:75.794581 ms
执行时间标准差:421.571821 µs
执行时间下四分位数:75.476998 ms(2.5%)
执行时间上四分位数:76.483561 ms(97.5%)
开销使用:2.127421 ns
在6个样本中找到1个异常值(16.6667%)
低严重 1(16.6667%)
异常值方差:13.8889% 异常值方差受异常值影响中等
rseq
警告:最后GC需要的运行时间占比为54.64906330819225%
评估计数:6个,抽样6次,每次调用1次。
执行时间平均:101.840831 ms
执行时间标准差:723.601456 µs
执行时间下四分位数:100.881998 ms(2.5%)
执行时间上四分位数:102.496873 ms(97.5%)
开销使用:2.127421 ns
CLA已签署。