在 CLJS 中,{{hash-ordered-coll}} 和 {{hash-unordered-coll}} 目前使用 {{seq}} 而不是迭代器来消费它们的集合。大多数核心集合类型都有自己的高效 {{-iterator}} 实现,这避免了 {{seq}} 本身固有的额外分配。
使用迭代器而不是其他方式,在大集合和更频繁的迭代时可以显示一定的性能提升; benchmarks-runner 大小(1000)和重复次数(100)在我这台机器(使用 "Intel(R) Core(TM) i7-4710MQ CPU @ 2.50GHz" 的 Ubuntu 18.04)上没有明显的差异。
`
(ns cljs.benchmark-runner
(:refer-clojure :exclude [println]))
(def println print)
(set! print-fn js/print)
;; 注意,coll 的大小和重复次数都是 benchmark-runner 通常使用的
;; 10 倍。
(def hash-coll-test
(loop [i 0 r []]
(if (< i 10000)
(recur (inc i) (conj r (str "foo" i)))
r)))
(def hash-imap-test
(loop [i 0 r {}]
(if (< i 10000)
(recur (inc i) (conj r [(keyword (str "foo" i)) i]))
r)))
(def hash-imap-int-test
(loop [i 0 r {}]
(if (< i 10000)
(recur (inc i) (conj r [i i]))
r)))
`
`
在 Ubuntu 18.04 上使用 "Intel(R) Core(TM) i7-4710MQ CPU @ 2.50GHz" 运行的基准测试
master 的基准测试结果
使用 V8 进行基准测试
[coll hash-coll-test], (hash-ordered-coll coll), 1000 次运行,1831 毫秒
[coll hash-imap-test], (hash-unordered-coll coll), 1000 次运行,6506 毫秒
[coll hash-imap-int-test], (hash-unordered-coll coll), 1000 次运行,8439 毫秒
此补丁的基准测试结果
使用 V8 进行基准测试
[coll hash-coll-test], (hash-ordered-coll coll), 1000 次运行,1629 毫秒
[coll hash-imap-test], (hash-unordered-coll coll), 1000 次运行,5753 毫秒
[coll hash-imap-int-test], (hash-unordered-coll coll), 1000 次运行,6810 毫秒
`