Performance 在Seq和Vector之间转换的性能成本是多少?

Performance 在Seq和Vector之间转换的性能成本是多少?,performance,clojure,Performance,Clojure,许多核心Clojure函数返回惰性序列,即使向其中传递向量也是如此。例如,如果我有一个数字向量,并希望根据某个谓词对其进行过滤,但又得到另一个向量,我必须执行以下操作: (进入[](过滤我的pred和我的vec)) 或: (vec(过滤我的pred我的vec)) 虽然我不确定两者之间是否有任何有意义的区别 这种操作是昂贵的,还是像转换到瞬态或从瞬态转换到瞬态时一样免费获得 我知道seq是惰性的,所以在将它放到输出向量之前,实际上不会计算任何内容,但是从seq和具体集合转换是否会有开销?它可以

许多核心Clojure函数返回惰性序列,即使向其中传递向量也是如此。例如,如果我有一个数字向量,并希望根据某个谓词对其进行过滤,但又得到另一个向量,我必须执行以下操作:

(进入[](过滤我的pred和我的vec))
或:

(vec(过滤我的pred我的vec))
虽然我不确定两者之间是否有任何有意义的区别

这种操作是昂贵的,还是像转换到瞬态或从瞬态转换到瞬态时一样免费获得


我知道seq是惰性的,所以在将它放到输出向量之前,实际上不会计算任何内容,但是从seq和具体集合转换是否会有开销?它可以用big-O来描述,还是big-O在这里没有意义?另一种方式呢,当从向量转换为序列时?

TL;别担心


较长版本:

  • 主要成本是内存分配/GC。通常这是微不足道的。如果RAM中同时容纳的数据太多,那么延迟版本可以节省您的时间

  • 如果你想测量玩具的问题,你可以尝试一下。尝试从10^2到10^9的10次幂


  • 对于N=2..9,有或没有
    (into[…)
    部分。

    的Clojure站点中有一个常见问题解答,对于一些复杂的转换(不仅仅是过滤,或者当谓词相当复杂时)可能很方便。否则,您可以利用核心库上的,并且您可以假设它为您进行了任何合理的优化。

    您能否详细说明一下“主要成本是内存分配/GC”?具体费用是多少?您只是分配了seq中的所有内容,还是分配了所有内容两次并取消了初始分配?我还没有完全考虑传感器,但这对于我的用例来说可能是有希望的。
    (crit/quick-bench (println :sum (reduce + 0 (into [] (range (Math/pow 10 N))))))