我正在尝试使用scala并行性来加快执行时间。
所以要将java ArrayList转换为我使用的不可变的:
var imList = scala.collection.JavaConversions.asScalaBuffer(normalQLFolderList)
然后在迭代时利用多个核心我使用:
for (i <- imList .par) {
}
我是否以正确的方式利用scala并行性?在这种情况下迭代列表。 asScalaBuffer是否有很大的性能影响?
答案 0 :(得分: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