diff options
author | Aleksandar Pokopec <aleksandar.prokopec@epfl.ch> | 2010-06-07 10:15:32 +0000 |
---|---|---|
committer | Aleksandar Pokopec <aleksandar.prokopec@epfl.ch> | 2010-06-07 10:15:32 +0000 |
commit | e67f56076624ea83383901934a30280d7f97380f (patch) | |
tree | a28b45d7a79ff9002735ea225b3a4733ac4d0234 /test/benchmarks/src/scala/collection/parallel/benchmarks/generic/ParallelBenches.scala | |
parent | dd396886d0da88326e5e4772af4d8813360ea8a5 (diff) | |
download | scala-e67f56076624ea83383901934a30280d7f97380f.tar.gz scala-e67f56076624ea83383901934a30280d7f97380f.tar.bz2 scala-e67f56076624ea83383901934a30280d7f97380f.zip |
Adding parallel collections to trunk.
sabbus also edited to add parallel collections to the library jar - review by phaller
Diffstat (limited to 'test/benchmarks/src/scala/collection/parallel/benchmarks/generic/ParallelBenches.scala')
-rw-r--r-- | test/benchmarks/src/scala/collection/parallel/benchmarks/generic/ParallelBenches.scala | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/test/benchmarks/src/scala/collection/parallel/benchmarks/generic/ParallelBenches.scala b/test/benchmarks/src/scala/collection/parallel/benchmarks/generic/ParallelBenches.scala new file mode 100644 index 0000000000..4e81cacd4d --- /dev/null +++ b/test/benchmarks/src/scala/collection/parallel/benchmarks/generic/ParallelBenches.scala @@ -0,0 +1,213 @@ +package scala.collection.parallel +package benchmarks +package generic + + + + + + + +trait ParallelIterableBench[T, Coll <: ParallelIterable[T]] extends collection.parallel.benchmarks.Bench { + self => + + protected var seqcoll: Iterable[T] = null + protected var parcoll: Coll = null.asInstanceOf[Coll] + + reset + + def reset = runWhat match { + case "seq" => this.seqcoll = createSequential(size, parallelism) + case "par" => this.parcoll = createParallel(size, parallelism) + case _ => + } + + def nameOfCollection: String + def operators: Operators[T] + def createSequential(sz: Int, p: Int): Iterable[T] + def createParallel(sz: Int, p: Int): Coll + + trait IterableBenchCompanion extends BenchCompanion { + def collectionName = self.nameOfCollection + } + + trait IterableBench extends ParallelIterableBench[T, Coll] { + def nameOfCollection = self.nameOfCollection + def operators = self.operators + def createSequential(sz: Int, p: Int) = self.createSequential(size, parallelism) + def createParallel(sz: Int, p: Int) = self.createParallel(size, parallelism) + def forkJoinPool: scala.concurrent.forkjoin.ForkJoinPool = self.forkJoinPool + } + + def forkJoinPool: scala.concurrent.forkjoin.ForkJoinPool + + override def printResults { + println(" --- Fork join pool state --- ") + println("Parallelism: " + forkJoinPool.getParallelism) + println("Active threads: " + forkJoinPool.getActiveThreadCount) + println("Work stealings: " + forkJoinPool.getStealCount) + } + +} + + +trait ParallelSeqBench[T, Coll <: ParallelSeq[T]] extends ParallelIterableBench[T, Coll] { + self => + + def createSequential(sz: Int, p: Int): Seq[T] + + trait SeqBenchCompanion extends BenchCompanion { + def collectionName = self.nameOfCollection + } + + trait SeqBench extends IterableBench with ParallelSeqBench[T, Coll] { + override def createSequential(sz: Int, p: Int) = self.createSequential(size, parallelism) + } + +} + + +trait NotBenchmark { + lazy val runWhat = ""; + val size = -1 + val parallelism = -1 + def runpar {} + def runseq {} + def companion = throw new UnsupportedOperationException +} + + +/** + * Standard benchmarks for collections. + */ +trait StandardParallelIterableBench[T, Coll <: ParallelIterable[T]] extends ParallelIterableBench[T, Coll] { + + object Reduce extends IterableBenchCompanion { + override def defaultSize = 50000 + def benchName = "reduce"; + def apply(sz: Int, p: Int, w: String) = new Reduce(sz, p, w) + } + + class Reduce(val size: Int, val parallelism: Int, val runWhat: String) + extends IterableBench with StandardParallelIterableBench[T, Coll] { + def comparisonMap = collection.Map() + def runseq = this.seqcoll.reduceLeft(operators.reducer) + def runpar = this.parcoll.reduce(operators.reducer) + def companion = Reduce + } + + object ReduceMedium extends IterableBenchCompanion { + override def defaultSize = 5000 + def benchName = "reduce-medium"; + def apply(sz: Int, p: Int, w: String) = new ReduceMedium(sz, p, w) + } + + class ReduceMedium(val size: Int, val parallelism: Int, val runWhat: String) + extends IterableBench with StandardParallelIterableBench[T, Coll] { + def comparisonMap = collection.Map() + def runseq = this.seqcoll.reduceLeft(operators.mediumreducer) + def runpar = this.parcoll.reduce(operators.mediumreducer) + def companion = ReduceMedium + } + +} + + + +/** + * Benchmarks for sequence views. + */ +trait ParallelSeqViewBench[T, Coll <: ParallelSeqView[T, ParallelSeq[T], CollSeq], CollSeq] extends ParallelSeqBench[T, Coll] { + + object Reduce extends IterableBenchCompanion { + override def defaultSize = 50000 + def benchName = "reduce"; + def apply(sz: Int, p: Int, w: String) = new Reduce(sz, p, w) + } + + class Reduce(val size: Int, val parallelism: Int, val runWhat: String) + extends SeqBench with ParallelSeqViewBench[T, Coll, CollSeq] { + def comparisonMap = collection.Map() + def runseq = this.seqcoll.reduceLeft(operators.reducer) + def runpar = this.parcoll.reduce(operators.reducer) + def companion = Reduce + } + + object MediumReduce extends IterableBenchCompanion { + override def defaultSize = 50000 + def benchName = "reduce-medium"; + def apply(sz: Int, p: Int, w: String) = new MediumReduce(sz, p, w) + } + + class MediumReduce(val size: Int, val parallelism: Int, val runWhat: String) + extends SeqBench with ParallelSeqViewBench[T, Coll, CollSeq] { + def comparisonMap = collection.Map() + def runseq = this.seqcoll.reduceLeft(operators.mediumreducer) + def runpar = this.parcoll.reduce(operators.mediumreducer) + def companion = Reduce + } + + object ModifyThenReduce extends SeqBenchCompanion { + override def defaultSize = 20000 + def benchName = "modify-then-reduce"; + def apply(sz: Int, p: Int, w: String) = new ModifyThenReduce(sz, p, w) + } + + class ModifyThenReduce(val size: Int, val parallelism: Int, val runWhat: String) + extends SeqBench with ParallelSeqViewBench[T, Coll, CollSeq] { + val toadd = createSequential(size, parallelism) + def comparisonMap = collection.Map() + def runseq = { + val modified = (seqcoll ++ toadd).drop(size).map(operators.mapper).++(toadd).take(size) + modified.reduceLeft(operators.reducer) + } + def runpar = { + val modified = (parcoll ++ toadd).drop(size).map(operators.mapper).++(toadd).take(size) + modified.reduce(operators.reducer) + } + def companion = ModifyThenReduce + } + + object ModifyThenForce extends SeqBenchCompanion { + override def defaultSize = 20000 + def benchName = "modify-then-force"; + def apply(sz: Int, p: Int, w: String) = new ModifyThenForce(sz, p, w) + } + + class ModifyThenForce(val size: Int, val parallelism: Int, val runWhat: String) + extends SeqBench with ParallelSeqViewBench[T, Coll, CollSeq] { + val toadd = createSequential(size, parallelism) + def comparisonMap = collection.Map() + def runseq = (seqcoll ++ toadd).drop(size).map(operators.mapper).++(toadd).take(size) + def runpar = { + val r: ParallelSeqView[T, ParallelSeq[T], Seq[T]] = (parcoll ++ toadd).drop(size).map(operators.mapper).++(toadd).take(size) + r.force + } + def companion = ModifyThenForce + } + +} + + + + + + + + + + + + + + + + + + + + + + + + |