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

欢迎!请查看关于页面以获取更多关于这是如何运作的信息。

0
ClojureScript

包含32个或更少元素且是{{seq}}的PersistenVector将返回一个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)不同,因为我们在JavaScript中更频繁地使用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
...