包含32个或更少元素且是{{seq}}的PersistenVector将返回一个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在代码库中被广泛使用,所以分块也会对许多其他代码路径产生影响。