分享您的看法,参与2024年Clojure调查!

欢迎!请参阅关于页面了解该功能的更多信息。

0
ClojureScript

元素数量小于等于32的 PersistenVector,并且执行了 {{seq}} 操作,将返回 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 在代码库中用得比较多,因此分块也会影响许多其他代码路径。

5 答案

0

评论由:aralo 发布

注意

这与 Clojure 不同(Clojure 不将 IndexedSeq 视为 ChunkedSeq),因为我们比 Clojure 更频繁地使用 IndexedSeq。例如

(apply (fn [& a] (type a)) [1 2 3 4 8])

在 CLJS 中将返回 IndexedSeq,而在 CLJ 中将返回 ChunkedCons。

由于这些 IndexedSeq 会在正常的 CLJS 应用程序中被广泛传递,因此将它们扩展为 IChunkedSeq 有意义,否则所有这些永远不会被分块,并且会获得缓慢的首个/下一个处理。

0

评论由:mfikes 发布

见 CLJS-2926

0

评论由:mfikes 发布

CLJS-2467.patch 通过 CI 和 Canary. (/)

0

评论由:mfikes 发布

将CLJS-2467.patch添加到补丁交涉(i)

0
...