一个具有 <=32 个元素且调用过 {{seq}} 的 PersistentVector 将返回一个 IndexedSeq。尽管 IndexedSeq 总是会失败 chunked-seq? 检查。
这意味着一个
(def xv (vec (range 32))) (reduce + (map inc xv))
会比在具有 33 个元素的向量上使用 map 运算慢约 4 倍。
选项
1. 在 PersistentVector.seq() 中返回一个具有 "rest" 设置为 nil 的 ChunkedCons
2. 为 IndexedSeq 实现 IChunkedSeq
`
(extend-type IndexedSeq
IChunkedSeq
(-chunked-first [x] x)
(-chunked-rest [x] ())
IChunkedNext
(-chunked-next [x] nil)
IChunk
(-drop-first [coll]
(if-some [n (-next coll)]
n
(throw (js/Error. "-drop-first of empty chunk")))))
`
我认为选项 #2 更好,因为 IndexedSeq 在整个代码库中都被广泛使用,因此分块也会影响许多其他代码路径。