package scala.collection.parallel.benchmarks.parallel_range
import scala.collection.parallel.benchmarks.generic._
import scala.collection.parallel.immutable.ParRange
import scala.collection.parallel.benchmarks.generic.StandardParIterableBenches
object RangeBenches extends StandardParIterableBenches[Int, ParRange] {
def nameOfCollection = "ParRange"
def operators = new IntOperators {}
def comparisonMap = collection.Map()
val forkJoinPool = new scala.concurrent.forkjoin.ForkJoinPool
def createSequential(sz: Int, p: Int) = new collection.immutable.Range(0, sz, 1)
def createParallel(sz: Int, p: Int) = {
val pr = collection.parallel.immutable.ParRange(0, sz, 1, false)
forkJoinPool.setParallelism(p)
collection.parallel.tasksupport.environment = forkJoinPool
pr
}
object MapLight extends IterableBenchCompanion {
override def defaultSize = 20000
def benchName = "map-light";
def apply(sz: Int, p: Int, w: String) = new MapLight(sz, p, w)
}
class MapLight(val size: Int, val parallelism: Int, val runWhat: String)
extends IterableBench {
def calc(n: Int) = n % 2 + 1
def comparisonMap = collection.Map()
def runseq = for (n <- this.seqcoll) yield calc(n)
def runpar = for (n <- this.parcoll) yield calc(n)
def companion = MapLight
}
object MapMedium extends IterableBenchCompanion {
override def defaultSize = 5000
def benchName = "map-medium";
def apply(sz: Int, p: Int, w: String) = new MapMedium(sz, p, w)
}
class MapMedium(val size: Int, val parallelism: Int, val runWhat: String)
extends IterableBench {
def calc(n: Int) = {
var i = 0
var sum = n
while (i < 40) {
i += 1
sum += n % i
}
sum
}
def comparisonMap = collection.Map()
def runseq = for (n <- this.seqcoll) yield calc(n)
def runpar = for (n <- this.parcoll) yield calc(n)
def companion = MapMedium
}
object ForeachModify extends IterableBenchCompanion {
override def defaultSize = 150000
def benchName = "foreach-modify";
def apply(sz: Int, p: Int, w: String) = new ForeachModify(sz, p, w)
}
class ForeachModify(val size: Int, val parallelism: Int, val runWhat: String)
extends IterableBench {
val array = new Array[Int](size)
def modify(n: Int) = array(n) += 1
def comparisonMap = collection.Map()
def runseq = for (n <- this.seqcoll) modify(n)
def runpar = for (n <- this.parcoll.asInstanceOf[ParRange]) {
modify(n)
()
}
def companion = ForeachModify
}
object ForeachModifyMedium extends IterableBenchCompanion {
override def defaultSize = 20000
def benchName = "foreach-modify-medium";
def apply(sz: Int, p: Int, w: String) = new ForeachModifyMedium(sz, p, w)
}
class ForeachModifyMedium(val size: Int, val parallelism: Int, val runWhat: String)
extends IterableBench {
val array = new Array[Int](size)
def modify(n: Int) = array(n) = {
var i = 0
var sum = 0
while (i < 15) {
sum += i % 3
i += i + 1
}
sum
}
def comparisonMap = collection.Map()
def runseq = for (n <- this.seqcoll) modify(n)
def runpar = for (n <- this.parcoll) modify(n)
def companion = ForeachModifyMedium
}
object ForeachModifyHeavy extends IterableBenchCompanion {
override def defaultSize = 1000
def benchName = "foreach-modify-heavy";
def apply(sz: Int, p: Int, w: String) = new ForeachModifyHeavy(sz, p, w)
}
class ForeachModifyHeavy(val size: Int, val parallelism: Int, val runWhat: String)
extends IterableBench {
val array = new Array[Int](size)
def modify(n: Int) = array(n) = collatz(10000 + array(n))
def comparisonMap = collection.Map()
def runseq = for (n <- this.seqcoll) modify(n)
def runpar = for (n <- this.parcoll) modify(n)
def companion = ForeachModifyHeavy
}
object ForeachAdd extends IterableBenchCompanion {
override def defaultSize = 10000
def benchName = "foreach-add";
def apply(sz: Int, p: Int, w: String) = new ForeachAdd(sz, p, w)
override def comparisons = List("seq-hashmap")
}
class ForeachAdd(val size: Int, val parallelism: Int, val runWhat: String)
extends IterableBench {
val cmap = new java.util.concurrent.ConcurrentHashMap[Int, Int]
val hmap = new java.util.HashMap[Int, Int]
override def reset = runWhat match {
case "seq-hashmap" => seqcoll = createSequential(size, parallelism)
case _ => super.reset
}
def comparisonMap = collection.Map("seq-hashmap" -> runseqhashmap _)
def runseqhashmap = for (i <- seqcoll) hmap put (i, onesum(i))
def runseq = for (i <- seqcoll) cmap put (i, onesum(i))
def runpar = for (i <- parcoll) cmap put (i, onesum(i))
def companion = ForeachAdd
}
object ForeachAddCollatz extends IterableBenchCompanion {
override def defaultSize = 5000
def benchName = "foreach-add-collatz";
def apply(sz: Int, p: Int, w: String) = new ForeachAddCollatz(sz, p, w)
override def comparisons = List("seq-hashmap")
}
class ForeachAddCollatz(val size: Int, val parallelism: Int, val runWhat: String)
extends IterableBench {
val cmap = new java.util.concurrent.ConcurrentHashMap[Int, Int]
val hmap = new java.util.HashMap[Int, Int]
override def reset = runWhat match {
case "seq-hashmap" => seqcoll = createSequential(size, parallelism)
case _ => super.reset
}
def comparisonMap = collection.Map("seq-hashmap" -> runseqhashmap _)
def runseqhashmap = for (i <- seqcoll) hmap put (i, collatz(i))
def runseq = for (i <- seqcoll) cmap put (i, collatz(i))
def runpar = for (i <- parcoll) cmap put (i, collatz(i))
def companion = ForeachAddCollatz
}
def collatz(n: Int) = {
var curr = n
var sum = 0
while (curr > 1) {
sum += curr
if (curr % 2 == 0) curr = curr / 2
else curr = curr * 3 + 1
}
sum
}
def onesum(n: Int) = {
var left = n
var sum = 0
while (left > 0) {
sum += left % 2
left /= 2
}
sum
}
}