Advertisement
Guest User

Untitled

a guest
Jun 11th, 2014
202
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 3.42 KB | None | 0 0
  1. object ParCollectionFun extends App {
  2.  
  3.   import scala.collection.par._
  4.   import scala.util.Random
  5.  
  6.   import Scheduler.Implicits.global
  7. //  import Scheduler.Implicits.sequential
  8.  
  9.  
  10.   def seq_sum(n: Int) = (0 until n).reduce(_ + _)
  11.  
  12.   def par_sum(n: Int) = (0 until n).toPar.reduce(_ + _)
  13.  
  14.   val n = 15000000
  15.  
  16.   def time[A](a: => A) = {
  17.     val now = System.nanoTime
  18.     val result = a
  19.     val micros = (System.nanoTime - now) / 1000
  20.       println("%f seconds".format(micros/1.0e6))
  21.     result
  22.   }
  23.  
  24.   def fib(n: Int): Long = if (n<=2) 1 else fib(n-1) + fib(n-2)
  25.  
  26.   def sumFib: Long = {
  27.     val nvalus = (1 until 47).toArray
  28.  
  29.  
  30.     val fibValus = nvalus.toPar.map(fib)
  31.    
  32.     fibValus.reduce (_ + _)
  33.  
  34.   }
  35.  
  36.   def sumFibFuture: Long = {
  37.     import scala.concurrent.{Future, Await}
  38.     import scala.concurrent.duration._
  39.     import scala.concurrent.ExecutionContext.Implicits.global
  40.  
  41.     val nvalus = (1 to 47).toSeq
  42.  
  43.     val fibValus = Future.sequence(nvalus map { case n => Future { fib(n) } })
  44.     val sumFuture = fibValus.map {case vals => vals.sum}
  45.  
  46.     Await.result(sumFuture, Duration.Inf)
  47.   }
  48.  
  49.   def seq_qsort(xs: Vector[Int]): Vector[Int] = {
  50.     def qsort_(xs: Vector[Int]): Vector[Int] =
  51.       if (xs.length <= 1000) xs.sorted else {
  52.         val pi = xs.hashCode.abs % xs.length
  53.         val pivot = xs(pi)
  54.  
  55.         val less = xs.filter { case elt => elt < pivot }
  56.         val eq = xs.filter { case elt => elt == pivot }
  57.         val greater = xs.filter { case elt => elt > pivot }
  58.  
  59.         qsort_(less) ++ eq ++ qsort_(greater)
  60.       }
  61.  
  62.     qsort_(xs)
  63.   }
  64.  
  65.   def par_qsort_future(xs: Vector[Int]): Vector[Int] = {
  66.     import scala.concurrent.{Future, Await}
  67.     import scala.concurrent.duration._
  68.     import scala.concurrent.ExecutionContext.Implicits.global
  69.     def qsort_(xs: Vector[Int]): Vector[Int] =
  70.       if (xs.length <= 10000) seq_qsort(xs) else {
  71.         val pi = xs.hashCode.abs % xs.length
  72.         val pivot = xs(pi)
  73.  
  74.         val less = Future { qsort_(xs.filter { case elt => elt < pivot }) }
  75.         val eq = xs.filter { case elt => elt == pivot }
  76.         val greater = Future { qsort_(xs.filter { case elt => elt > pivot }) }
  77.  
  78.         val sorted = for { lt <- less
  79.           ge <- greater } yield lt ++ eq ++ ge
  80.  
  81.         Await.result(sorted, Duration.Inf)
  82.       }
  83.  
  84.     qsort_(xs)
  85.   }
  86.  
  87.  
  88.   def par_qsort(xs: Vector[Int]): Vector[Int] = {
  89.     def qsort_(xs: Array[Int]): Array[Int] =
  90.       if (xs.length <= 10000) seq_qsort(xs.toVector).toArray  else {
  91.         val pi = xs.hashCode.abs % xs.length
  92.         val pivot = xs(pi)
  93.  
  94.         val less = xs.filter { case elt => elt < pivot }
  95.         val eq = xs.filter { case elt => elt == pivot }
  96.         val greater = xs.filter { case elt => elt > pivot }
  97.  
  98.        
  99.         val ans = Array(less, greater).map {case toSort => qsort_(toSort)}
  100.  
  101.         ans(0) ++ eq ++ ans(1)
  102.       }
  103.  
  104.     qsort_(xs.toArray).toVector
  105.   }
  106.  
  107.   val a = time { seq_sum(n) }
  108.   println(s"seq: $a")
  109.  
  110.   val b = time { par_sum(n) }
  111.   println(s"par: $b")
  112.  
  113.   println("creating a permutation")
  114.   val in = time { Random.shuffle((1 to 10000000).toVector) }
  115.  
  116.   println("sorting: seq")
  117.   time {seq_qsort(in)}
  118.   println("sorting: future")
  119.   time {par_qsort_future(in)}
  120.   println("sorting: blitz")
  121.   time {par_qsort(in)}
  122.  
  123. //  val c = time { sumFib }
  124. //  println(s"sumFib: $c")
  125.  
  126. //  val d = time { sumFibFuture }
  127. //  println(s"sumFibFuture: $d")
  128.  
  129.  
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement