2024年Clojure状态调查!中分享您的想法。

欢迎!有关如何工作的更多信息,请参阅关于页面。

0
ClojureScript

具有 <=32 个元素并使用 {{seq}}'ed 的 PersistentVector 将返回一个 IndexedSeq。尽管 IndexedSeq 总是会失败 chunked-seq? 检查。

这意味着一个

(def xv (vec (range 32))) (reduce + (map inc xv))

比包含 33 个元素的向量的映射操作慢 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)不同,因为我们在 ClojureScript 中更多使用 IndexedSeq 而不是 ChunkedSeq。例如

(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
by

由 mfikes 评论

CLJS-2467.patch已添加到Patch Tender (i)

0
by
...