如之前在
https://github.com/ztellman/immutable-int-map/pull/1中讨论过
我注意到现有的Seq实现不是懒加载的,所以我只是在这个基础之上实现了一个基本的反向迭代器,而不是直接遍历树形结构 - 实际上我对Clojure核心库不直接提供ArrayList的可逆接口感到有些惊讶
从
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 %的运行时间
评估次数:在6个样本中的12次调用。
执行时间平均值:75.794581 ms
执行时间标准差:421.571821 µs
执行时间下四分位数:75.476998 ms ( 2.5%)
执行时间上四分位数:76.483561 ms (97.5%)
使用开销:2.127421 ns
在6个样本中找到1个异常值(16.6667%)
low-severe 1 (16.6667 %)
异常值带来的方差:13.8889 %,方差因异常值而适度膨胀
rseq
警告:最终GC需要54.64906330819225 %的运行时间
评估次数:在6个样本中的6次调用。
执行时间平均值:101.840831 ms
执行时间标准差:723.601456 µs
执行时间下四分位数:100.881998 ms ( 2.5%)
执行时间上四分位数:102.496873 ms (97.5%)
使用开销:2.127421 ns
已签署CLA。