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)不同,因为我们更多地使用 IndexedSeq,而 Clojure 通常使用 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 投票

留言者:mfikes

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

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