【发布时间】:2019-08-14 08:36:51
【问题描述】:
根据我的测试,read、Array 是通过foreach、while 和tailrec 进行随机访问或迭代时最快的集合,但它们是可变的,与@987654327 不同@,不幸的是没有Array那么快。
我仍然坚持使用 Scala 2.11,但我最近发现 Scala 2.13 已经进行了更改。是否有希望存在或将存在一个在随机访问方面超过Array 的不可变集合?
这是Array[Double] 上的欧几里得距离示例,它在 Seq 后代上的工作原理完全相同。
final def euclidean(v1: Array[Double], v2: Array[Double]): Double = {
@annotation.tailrec
def go(d: Double, i: Int): Double = {
if(i < v1.size) {
val toPow2 = v1(i) - v2(i)
go(d + toPow2 * toPow2, i + 1)
}
else d
}
sqrt(go(0D, 0))
}
【问题讨论】:
-
2.13将有一个immutable Array。 -
我刚刚尝试使用
tailrec比较欧几里得距离,而 ArraySeq 运行 1M 时仍然慢约 10%。 -
tailrec是什么意思?使用head和tail拆分集合的尾递归算法?如果是这样,您可能最好使用 List 而不是 Array。每个tail调用都会将数组的内容复制到一个新的。 数组适用于迭代算法。 -
在这种情况下我没有使用 tail 和 head,只需将 while 循环替换为尾递归调用以迭代
X <: Seq或Array。 -
能否分享问题中的代码。我不是集合方面的专家,但如果您查看源代码,immutable Array 只是普通 (mutable) 的包装器数组。所以,它们的行为应该非常相似,或者至少我相信如此。
标签: scala performance collections