summaryrefslogtreecommitdiff
path: root/test/benchmarks
diff options
context:
space:
mode:
authorAleksandar Pokopec <aleksandar.prokopec@epfl.ch>2011-01-07 12:05:31 +0000
committerAleksandar Pokopec <aleksandar.prokopec@epfl.ch>2011-01-07 12:05:31 +0000
commit733a3d756943e67d7608dbfd92aac445a080d69d (patch)
tree6ce9bb74cee997212845c6fac15c8923b54c55ec /test/benchmarks
parent07edcee629fb00808fb695ba4ec68a26f3e99490 (diff)
downloadscala-733a3d756943e67d7608dbfd92aac445a080d69d.tar.gz
scala-733a3d756943e67d7608dbfd92aac445a080d69d.tar.bz2
scala-733a3d756943e67d7608dbfd92aac445a080d69d.zip
Implemented a (slower) workaround for parallel ...
Implemented a (slower) workaround for parallel vectors. Implemented group by. No review.
Diffstat (limited to 'test/benchmarks')
-rw-r--r--test/benchmarks/source.list2
-rw-r--r--test/benchmarks/src/scala/collection/parallel/Benchmarking.scala1
-rw-r--r--test/benchmarks/src/scala/collection/parallel/benchmarks/misc/Coder.scala79
-rw-r--r--test/benchmarks/src/scala/collection/parallel/benchmarks/misc/Dictionary.scala3
-rw-r--r--test/benchmarks/src/scala/collection/parallel/benchmarks/misc/Loader.scala64
-rw-r--r--test/benchmarks/src/scala/collection/parallel/benchmarks/parallel_array/GroupBy.scala45
6 files changed, 163 insertions, 31 deletions
diff --git a/test/benchmarks/source.list b/test/benchmarks/source.list
index 65ab4b9ca9..c5d5f7f8fe 100644
--- a/test/benchmarks/source.list
+++ b/test/benchmarks/source.list
@@ -22,6 +22,7 @@ src/scala/collection/parallel/benchmarks/parallel_array/SumLight.scala
src/scala/collection/parallel/benchmarks/parallel_array/MinLight.scala
src/scala/collection/parallel/benchmarks/parallel_array/CountList.scala
src/scala/collection/parallel/benchmarks/parallel_array/PatchHalf.scala
+src/scala/collection/parallel/benchmarks/parallel_array/GroupBy.scala
src/scala/collection/parallel/benchmarks/parallel_array/DiffHalf.scala
src/scala/collection/parallel/benchmarks/parallel_array/TakeMany.scala
src/scala/collection/parallel/benchmarks/parallel_array/PartialMapLight.scala
@@ -65,6 +66,7 @@ src/scala/collection/parallel/benchmarks/generic/ParallelBenches.scala
src/scala/collection/parallel/benchmarks/generic/Dummy.scala
src/scala/collection/parallel/benchmarks/parallel_range/RangeBenches.scala
src/scala/collection/parallel/benchmarks/misc/Dictionary.scala
+src/scala/collection/parallel/benchmarks/misc/Loader.scala
src/scala/collection/parallel/benchmarks/misc/Coder.scala
src/scala/collection/parallel/benchmarks/Bench.scala
src/scala/collection/parallel/benchmarks/hashtries/Foreach.scala
diff --git a/test/benchmarks/src/scala/collection/parallel/Benchmarking.scala b/test/benchmarks/src/scala/collection/parallel/Benchmarking.scala
index 65b9be4ca3..cbda3551e0 100644
--- a/test/benchmarks/src/scala/collection/parallel/Benchmarking.scala
+++ b/test/benchmarks/src/scala/collection/parallel/Benchmarking.scala
@@ -66,6 +66,7 @@ trait BenchmarkRegister {
register(parallel_array.AggregateLight)
register(parallel_array.ScanLight)
register(parallel_array.ScanMedium)
+ register(parallel_array.GroupByLight)
register(parallel_array.MatrixMultiplication)
// parallel views
diff --git a/test/benchmarks/src/scala/collection/parallel/benchmarks/misc/Coder.scala b/test/benchmarks/src/scala/collection/parallel/benchmarks/misc/Coder.scala
index 4f809cf734..5ed0ca317d 100644
--- a/test/benchmarks/src/scala/collection/parallel/benchmarks/misc/Coder.scala
+++ b/test/benchmarks/src/scala/collection/parallel/benchmarks/misc/Coder.scala
@@ -2,8 +2,12 @@ package scala.collection.parallel.benchmarks
package misc
-import collection.immutable._
-import collection.parallel.immutable._
+
+
+
+
+import collection._ //immutable._
+import collection.parallel._//immutable._
class SeqCoder(words: List[String]) {
@@ -23,24 +27,32 @@ class SeqCoder(words: List[String]) {
/** A map from digit strings to the words that represent
* them e.g. `5282` -> List(`Java`, `Kata`, `Lava`, ...)
*/
- val wordsForNum: Map[String, List[String]] =
- words groupBy wordCode withDefaultValue List()
+ val wordsForNum: Map[String, Seq[String]] =
+ (words groupBy wordCode).map(t => (t._1, t._2.toSeq)) withDefaultValue Seq()
/** All ways to encode a number as a list of words */
- def encode(number: String): Set[List[String]] =
- if (number.isEmpty) Set(List())
+ def encode(number: String): Set[Seq[String]] =
+ if (number.isEmpty) Set(Seq())
else {
val splits = (1 to number.length).toSet
- for {
- split <- splits
- word <- wordsForNum(number take split)
- rest <- encode(number drop split)
- } yield word :: rest
+ // for {
+ // split <- splits
+ // word <- wordsForNum(number take split)
+ // rest <- encode(number drop split)
+ // } yield word :: rest
+ val r = splits.flatMap(split => {
+ val wfn = wordsForNum(number take split).flatMap(word => {
+ val subs = encode(number drop split)
+ subs.map(rest => word +: rest)
+ })
+ wfn
+ })
+ r
}
/** Maps a number to a list of all word phrases that can
* represent it */
- def translate(number: String): Set[String] = encode(number) map (_ mkString " ")
+ def translate(number: String) = encode(number)// map (_ mkString " ")
def ??? : Nothing = throw new UnsupportedOperationException
}
@@ -62,37 +74,43 @@ class ParCoder(words: List[String]) {
/** A map from digit strings to the words that represent
* them e.g. `5282` -> List(`Java`, `Kata`, `Lava`, ...)
*/
- val wordsForNum: Map[String, List[String]] =
- words groupBy wordCode withDefaultValue List()
+ val wordsForNum: Map[String, Seq[String]] =
+ (words groupBy wordCode).map(t => (t._1, t._2)) withDefaultValue Seq()
/** All ways to encode a number as a list of words */
- def encode(number: String): ParSet[List[String]] =
- if (number.isEmpty) ParSet(List())
+ def encode(number: String): Set[Seq[String]] = if (number.length > 12) {
+ if (number.isEmpty) ParSet(ParSeq())
else {
val splits = (1 to number.length).toParSet
for {
- split <- splits
- word <- wordsForNum(number take split)
- rest <- encode(number drop split)
- } yield word :: rest
+ split <- splits
+ word <- wordsForNum(number take split)
+ rest <- encode(number drop split)
+ } yield word +: rest
+ }
+ } else {
+ if (number.isEmpty) Set(Seq())
+ else {
+ val splits = (1 to number.length).toSet
+ for {
+ split <- splits
+ word <- wordsForNum(number take split)
+ rest <- encode(number drop split)
+ } yield word +: rest
}
+ }
/** Maps a number to a list of all word phrases that can
* represent it */
- def translate(number: String): ParSet[String] = encode(number) map (_ mkString " ")
+ def translate(number: String) = {
+ encode(number)// map (_ mkString " ")
+ }
def ??? : Nothing = throw new UnsupportedOperationException
}
-/** Test code */
-object Main {
- def main(args : Array[String]) : Unit = {
- val coder = new SeqCoder(List("Scala", "Python", "Ruby", "Java", "Kata", "Lava", "a", "rocks", "pack", "rack", "sucks", "works"))
- println(coder.wordsForNum)
- println(coder.translate("7225276257"))
- }
-}
+
object Coder extends BenchCompanion {
@@ -110,7 +128,7 @@ class Coder(val size: Int, val parallelism: Int, val runWhat: String) extends Be
override def repetitionsPerRun = 1
- val code = "2328437472947362626"//33"//837976"//"6477323986225453446"
+ val code = "23284374729473626268379762538"
reset
@@ -131,6 +149,7 @@ class Coder(val size: Int, val parallelism: Int, val runWhat: String) extends Be
println("Translation check: " + t.size)
//println(t)
case "par" =>
+ collection.parallel.tasksupport.environment.asInstanceOf[concurrent.forkjoin.ForkJoinPool].setParallelism(parallelism)
parcoder = new ParCoder(Dictionary.wordlist)
val t = parcoder.translate(code)
println("Translation check: " + t.size)
diff --git a/test/benchmarks/src/scala/collection/parallel/benchmarks/misc/Dictionary.scala b/test/benchmarks/src/scala/collection/parallel/benchmarks/misc/Dictionary.scala
index 7ab5d94e93..e6ff55d234 100644
--- a/test/benchmarks/src/scala/collection/parallel/benchmarks/misc/Dictionary.scala
+++ b/test/benchmarks/src/scala/collection/parallel/benchmarks/misc/Dictionary.scala
@@ -4,7 +4,8 @@ package scala.collection.parallel.benchmarks.misc
object Dictionary {
- val words = wordlines.split(System.getProperty("line.separator")).filter(_.trim != "").toList
+ val wordlist = wordlines.split(System.getProperty("line.separator")).filter(_.trim != "").toList
+ val wordarray = wordlist.toArray
def wordlines = {
val is = getClass.getClassLoader.getResourceAsStream("scala/collection/parallel/benchmarks/misc/dict.txt")
scala.io.Source.fromInputStream(is).mkString
diff --git a/test/benchmarks/src/scala/collection/parallel/benchmarks/misc/Loader.scala b/test/benchmarks/src/scala/collection/parallel/benchmarks/misc/Loader.scala
new file mode 100644
index 0000000000..2a9fc2c3ef
--- /dev/null
+++ b/test/benchmarks/src/scala/collection/parallel/benchmarks/misc/Loader.scala
@@ -0,0 +1,64 @@
+package scala.collection.parallel.benchmarks
+package misc
+
+
+
+
+
+
+import collection._ //immutable._
+import collection.parallel._//immutable._
+
+
+
+
+
+
+
+object Loader extends BenchCompanion {
+ def benchName = "Loader"
+ def collectionName = "General"
+ def apply(sz: Int, p: Int, what: String) = new Loader(sz, p, what)
+ override def defaultSize = 100
+}
+
+
+class Loader(val size: Int, val parallelism: Int, val runWhat: String) extends Bench {
+ def companion = Loader
+
+ override def repetitionsPerRun = 1
+
+ reset
+
+ def runseq {
+ val m = Map(
+ '2' -> "ABC", '3' -> "DEF", '4' -> "GHI", '5' -> "JKL",
+ '6' -> "MNO", '7' -> "PQRS", '8' -> "TUV", '9' -> "WXYZ"
+ )
+ val charCode: Map[Char, Char] = for ((digit, letters) <- m; letter <- letters) yield letter -> digit
+ def wordCode(word: String): String = word.toUpperCase map charCode
+
+ Dictionary.wordarray groupBy wordCode
+ }
+
+ def runpar {
+ val m = Map(
+ '2' -> "ABC", '3' -> "DEF", '4' -> "GHI", '5' -> "JKL",
+ '6' -> "MNO", '7' -> "PQRS", '8' -> "TUV", '9' -> "WXYZ"
+ )
+ val charCode: Map[Char, Char] = for ((digit, letters) <- m; letter <- letters) yield letter -> digit
+ def wordCode(word: String): String = word.toUpperCase map charCode
+
+ Dictionary.wordarray.par groupBy wordCode
+ }
+
+ def reset = runWhat match {
+ case "seq" =>
+ case "par" =>
+ collection.parallel.tasksupport.environment.asInstanceOf[concurrent.forkjoin.ForkJoinPool].setParallelism(parallelism)
+ }
+
+ def comparisonMap = Map()
+
+}
+
diff --git a/test/benchmarks/src/scala/collection/parallel/benchmarks/parallel_array/GroupBy.scala b/test/benchmarks/src/scala/collection/parallel/benchmarks/parallel_array/GroupBy.scala
new file mode 100644
index 0000000000..abfba42b78
--- /dev/null
+++ b/test/benchmarks/src/scala/collection/parallel/benchmarks/parallel_array/GroupBy.scala
@@ -0,0 +1,45 @@
+package scala.collection.parallel.benchmarks
+package parallel_array
+
+
+
+object GroupByLight extends Companion {
+ def benchName = "groupby-light";
+ def apply(sz: Int, parallelism: Int, what: String) = new GroupByLight(sz, parallelism, what)
+ override def comparisons = List()
+ override def defaultSize = 10000
+
+ val fun = (a: Cont) => a.in % 2
+}
+
+
+class GroupByLight(sz: Int, p: Int, what: String)
+extends Resettable(sz, p, what, new Cont(_), new Array[Any](_), classOf[Cont])
+with HavingResult[Int] {
+ def companion = GroupByLight
+ runresult = -1
+
+ val array = new Array[Cont](sz)
+ for (i <- 0 until sz) array(i) = new Cont(i)
+
+ def runpar = runresult = pa.groupBy(GroupByLight.fun).size
+ def runseq = runresult = array.asInstanceOf[Array[Cont]].groupBy(GroupByLight.fun).size
+ def comparisonMap = collection.Map()
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+