【发布时间】:2015-02-06 20:46:27
【问题描述】:
我的印象是在不可变的 Seq 上调用 seq.toList() 将创建一个新列表,该列表共享第一个列表的结构状态。我们发现这可能真的很慢,我不知道为什么。 只是共享结构状态,对吗?我不明白为什么当它知道它们永远不会改变时,它会制作所有元素的 n 次副本。
【问题讨论】:
-
您能否指定将其归类为快速的标准是什么?
-
所以我认为标准是它看起来比仅仅更新一个简单的对象要慢得多。我的同事进行简单测试实际上是在将它与 JWrappers 进行比较(使用隐式转换将 seq 转换为列表。我的意思是 - 当我们运行超过 1M 项时,不同之处在于 toList 函数是两倍慢(JWrappers 和隐式转换为 15 秒,toList 为 30 秒。我必须在这里遗漏一些东西。
-
显示您的代码?我们只能在这里猜测您的基准是什么。
-
我们正在使用 [1] 中的第三个策略,以便我们可以在 Scala 2.10 中使用 Collections.binarySearch()。注意这里的 import java.util.List => JList 以及它如何使用 asScalaList 隐式进行从 a.toList 到 JList[T] 的隐式转换。如果我们在没有 toList 的情况下这样做,它会很快,添加 toList 会很慢。有任何想法吗? [1]stackoverflow.com/questions/4226947/…
-
调用 seq.iterator.toList 似乎是共享的结构状态 - 因此它的速度很快。还有人看到这个吗?
标签: scala