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),因为我们在 Clojure 中相比经常使用 ChunkedSeq 时更多地使用 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 已添加到Patch Tender中。

0
参考:[https://clojure.atlassian.net/browse/CLJS-2467](https://clojure.atlassian.net/browse/CLJS-2467) (由aralo报告)
...