Scala并行集合框架初探
?Scala 并行集合框架( Parallel Collections Framework)是在2.9版添加的重要功能,用于多核环境的并行计算。
主要用到的算法有:
?
divide and conquer : 分治算法? ?Scala通过splitters,combiners等抽象层来实现,主要原理是将计算工作分解很多任务,分发给一些处理器去完成[,并将它们处理结果合并返回]。
?
Work stealing算法? ?主要用于任务调度负载均衡(load-balancing),通俗点完成自己的所有任务之后,发现其他人还有活没干完,主动(或被安排)帮他人一起干,这样达到尽早干完的目的。
?
并行集合位于scala.collection.parallel,跟普通集合(regular collections)一样,分immutable和mutable。主要实现类是:
?
object ParBenchmark { case class Result(item: Int, c: Long, p: Long) { override def toString = "%-10s\t%-10d\t%-10d".format(item, c, p) } def time(proc: => Any) = { def curr = System.currentTimeMillis val s = curr; proc; curr - s } def even(i: Int) = i % 2 == 0 def b(count: Int) = Some((1 to count).toList). map(it => (it, it.par)).headOption. map { it => Result(it._1.size, time(it._1 filter even), time(it._2 filter even)) } def main(args: Array[String]): Unit = { println("item\tcommon\tpar") Array(1, 2, 5, 10, 12, 15, 18, 20).map(_ * 1000000). foreach { it => Runtime.getRuntime.gc() Thread.sleep(2000) println(b(it).get) } } }?几次执行结果如下:
?
item regular par?
?
?
初步结论
?
计算数据量少,并行集合性能不占优势,甚至还处于劣势? ? ? ? ? ? ?估计是线程切换、分发合并等额外操作消耗的时间。
? ? ? ?
?
计算数据量大时,如达到千万级别时,并行集合性能优势凸显出来了? ? ? ? ? ? ?当然这些跟本机硬件环境相关,CPU数内核数越多,并行计算当然更有效率。
?
4 更深入深入理解并行集合框架实现的细节,学习《A Generic Parallel Collection Framework》论文;
与JDK 7 fork/join 框架的关系及对比;
5 附录更多使用见测试用例代码:
??https://github.com/itang/_learn/blob/master/scala/what_is_new_scala_2.9.0/src/test/scala/me/itang/learn_scala/what_is_new_scala_290/ParallelSpec.scala
?
参考资料:
? http://kotek.net/blog/quick_look_at_upcoming_parallel_collections_in_scala_2.9
? http://infoscience.epfl.ch/record/150220/files/pc.pdf
? ?