2024 Clojure现状调查中分享您的想法!

欢迎!请查看关于页面了解更多关于该系统运作的信息。

0
ClojureScript

一个具有 <=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 在整个代码库中都被广泛使用,因此分块也会影响许多其他代码路径。

5 个回答

0

由aralo发表的评论

注意

这与 Clojure 不同,Clojure(通常不把 IndexedSeq 看作是 ChunkedSeq)相反,因为我们在 CLJS 中更多使用 IndexedSeq。例如

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

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

由于这些 IndexedSeq 将在正常的 CLJS 应用程序中被广泛使用,因此将其扩展为 IChunkedSeq 感觉上是合理的,否则这些 IndexedSeq 将永远不会进行分块并得到较慢的处理。

0

由mfikes发表的评论

参见CLJS-2926

0

由mfikes发表的评论

CLJS-2467.patch已通过CI和Canary测试。(/)

0

由mfikes发表的评论

将CLJS-2467.patch添加到补丁提名(i)

0
...