当我们将元素推到末尾时,PersistentVector 中的 seq 比 PersistentList 中的 seq 更快吗?

问题描述 投票:0回答:1

seq 是来自 PersistentVector 吗

(seq [1 2 3])

比 PersistentList 中的 seq 更快

(seq '(1 2 3))

当我们将元素推入其中时? 除了类型之外,它们的性能是否相同?

我试图在互联网上寻找答案,但不幸的是没有找到任何关于

的比较
(seq [1 2 3])

(seq `(1 2 3))
clojure
1个回答
0
投票

[1 2 3]
的类型是PersistentVector
(1 2 3)
的类型是clojure.lang.Cons

调用 seq 只是调用 RT.seq,如果集合是

ASeq
的实例,则它有一个快捷方式,否则调用
RT.seqFrom
创建一个新序列。由于
Cons
已经是
ASeq
的实例,因此它只会返回参数,而不创建新的 seq 对象。

user=> (def abc `(1 2 3))
#'user/abc

user=> (identical? abc (seq abc))
true

总而言之,调用

(seq '(1 2 3))
应该比调用
(seq [1 2 3])
稍快一些,因为在前一种情况下,它只是直接返回参数,但在后一种情况下,会为向量分配一个新的
ChunkedSeq

但是,请注意,在生产环境中差异可能仍然可以忽略不计,并且在为真正的低延迟应用程序编写代码时需要考虑许多其他因素。

© www.soinside.com 2019 - 2024. All rights reserved.