将顺序集合转换为并行集合的成本是多少,而不是从头开始创建它



根据官方文档,有两个选项可以创建并行集合:

1)

// There's a little bug here, doesn't matter for the sake of the question
import scala.collection.parallel.mutable.ParArray
val pv = new ParVector[Int]

2)

val pv = Vector(1,2,3,4,5,6,7,8,9).par

现在,有什么不同?当我从一个简单的顺序集合转换它时,是否存在任何性能损失?

如果你必须创建一个稍微平行的集合(比如说,几千个元素),你会怎么做?你会从头开始创建它还是转换它?

谢谢你们!

编辑:

正如@oxbow_lakes所说,有一篇文档关注这个话题,但我正在努力获得"经验丰富的建议"。我的意思是,例如,如果你必须从数据库中读取一个大集合,你会怎么做。

取决于集合。Vector基本上是免费的,ParVector只是向量的包装器。与Arrays相同。其他的,例如List,必须以不同的结构完全复制,更易于并行。然后复制回一个新的列表,如果你希望你的结果也是一个列表。

您可以在scala文档网站上的"创建并行集合"一节中查看此全新指南。

par方法的官方文档中写道:

对于大多数集合类型,此方法通过复制所有元素来创建新的并行集合。对于这些集合,par需要线性时间[…]

特定集合(例如ParArraymutable.ParHashMap)通过创建共享相同底层数据集的并行集合来覆盖此默认行为。对于这些集合,par需要常量或次线性时间

也就是说,通常情况下,O(n)中的操作,除非使用可变集合ParArrayParHashMap,其中它小于O(n,但可能不是恒定时间。

相关内容

  • 没有找到相关文章

最新更新