7

我正在尝试使用 scala 并行性来加快执行时间。

因此,要将 java ArrayList 转换为不可变的,我使用:

var imList = scala.collection.JavaConversions.asScalaBuffer(normalQLFolderList)

然后在迭代时利用多个核心,我使用:

for (i <- imList .par) {
}

我是否以正确的方式利用 scala 并行性?在这种情况下迭代一个列表。asScalaBuffer 对性能有很大影响吗?

4

1 回答 1

5

可以在恒定时间内转换为并行对应的集合包括可变和不可变哈希映射以及哈希集、范围、向量和数组。对于所有其他集合类型,包括来自 Java 的集合的包装器,调用par会导致将集合的内容复制为更适合并行化的格式。

此处对此进行了更详细的描述:

http://docs.scala-lang.org/overviews/parallel-collections/conversions.html

但是,根据收藏的规模和for区块的价格,为这种转换付费可能是完全合理的。并行for块对每个元素所做的处理越多,转换成本的摊销就越多。

我想说,如果每个元素的计算涉及任何不平凡的事情(例如,它至少创建新对象)为转换付费是有意义的,但一个好主意是测量顺序版本和并行版本之间的性能差异,包括调用par

http://docs.scala-lang.org/overviews/parallel-collections/performance.html

于 2013-02-22T13:08:48.123 回答