Bar*_*ski 7 collections parallel-processing scala
我正在尝试使用scala并行集合来实现一些cpu密集型任务,我想抽象出算法的执行方式(顺序,并行甚至分布式),但代码不能正常工作,因为我怀疑我不知道我做错了什么.
我想抽象出这个问题的方式如下:
// just measures time a block of code runs
def time(block: => Unit) : Long = {
val start = System.currentTimeMillis
block
val stop = System.currentTimeMillis
stop - start
}
// "lengthy" task
def work = {
Thread.sleep(100)
println("done")
1
}
import scala.collection.GenSeq
abstract class ContextTransform {
def apply[T](genSeq: GenSeq[T]): GenSeq[T]
}
object ParContextTransform extends ContextTransform {
override def apply[T](genSeq: GenSeq[T]): GenSeq[T] = genSeq.par
}
// this works as expected
def callingParDirectly = {
val range = (1 to 10).par
// make sure we really got a ParSeq
println(range)
for (i <- range) yield work
}
// this doesn't
def callingParWithContextTransform(contextTransform: ContextTransform) = {
val range = contextTransform(1 to 10)
// make sure we really got a ParSeq
println(range)
for (i <- range) yield work
}
Run Code Online (Sandbox Code Playgroud)
解释器的结果:
scala> time(callingParDirectly)
ParRange(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
done
// ...
done
res20: Long = 503
scala> time(callingParWithContextTransform(ParContextTransform))
ParRange(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
done
// ...
done
res21: Long = 1002
Run Code Online (Sandbox Code Playgroud)
我的第一个赌注是该集合没有正确分割,并且println的"完成"确实表明......但如果我不产生任何东西(仅运行工作方法),上面的代码效果很好.
我无法理解为什么这个callingParWithContextTransform方法不起作用callingParDirectly; 我错过了什么?
Daniel Sobral是对的,这是一个已知的bug.我可以使用Scala 2.9.1.RC3重现您的结果,但它已在主干中修复.这是一个演示减速的简化版本:
// just measures time a block of code runs
def time(block: => Unit) : Long = {
val start = System.currentTimeMillis
block
val stop = System.currentTimeMillis
stop - start
}
// "lengthy" task
def work = {
Thread.sleep(100)
1
}
def run() {
import scala.collection.GenSeq
print("Iterating over ParRange: ")
println(time(for (i <- (1 to 10).par) yield work))
print("Iterating over GenSeq: ")
println(time(for (i <- (1 to 10).par: GenSeq[Int]) yield work))
}
run()
Run Code Online (Sandbox Code Playgroud)
我在2.9.1.RC3上得到的输出是
Iterating over ParRange: 202
Iterating over GenSeq: 1002
Run Code Online (Sandbox Code Playgroud)
但是在2.10的每晚构建中,两个版本都在大约200ms内运行.
| 归档时间: |
|
| 查看次数: |
378 次 |
| 最近记录: |