package robbypelssers.concurrency trait Store[K,V] { def find(k: K): Option[V] def save(v: V): Unit def getName(): String }
Now we create a mutable and immutable store (both insert key-value pairs (index mapped to fibonacci number) in respectively a mutable and immutable hashmap.
package robbypelssers.concurrency import collection.mutable.HashMap class MutableFibonacciStore extends Store[Int, Int] with Fibonacci { val store = new HashMap[Int, Int] def find(n: Int): Option[Int] = synchronized(store.get(n)) def save(n: Int): Unit = synchronized(store.put(n, fibonacci(n))) def getName() = "MutableFibonacciStore" }
package robbypelssers.concurrency import collection.immutable.HashMap class ImmutableFibonacciStore extends Store[Int, Int] with Fibonacci { var store = new HashMap[Int,Int] def find(n: Int): Option[Int] = store.get(n) def save(n: Int): Unit = synchronized(store = store + ((n, fibonacci(n)))) def getName() = "ImmutableFibonacciStore" }
package robbypelssers.concurrency trait Fibonacci { def fibonacci(n: Int): Int = n match { case 0 => 0 case 1 => 1 case _ => fibonacci(n-2) + fibonacci(n-1) } }
Below a very simple profiler which will give some idea of how long both stores will take to do a lot of calls to find and save.
package robbypelssers.concurrency import java.util.Date object Profiler { /** * profile method works like an Around Advice in AspectOriented programming */ def profile[T](body: => T) = { val start = new Date() val result = body val end = new Date() println("Execution took " + (end.getTime() - start.getTime()) / 1000 + " seconds") result } }
package robbypelssers.concurrency import java.util.Date import Profiler._ object StoreConcurrencyTest extends App { val immutableStore = new ImmutableFibonacciStore() val mutableStore = new MutableFibonacciStore() val numberOfOperations = 40 def useStore(store: Store[Int,Int], n: Int) { println("using " + store.getName()) for (x:Int <- 1 to n) { store.save(x) } for (x:Int <- 1 to n) { store.find(x) } } profile(useStore(immutableStore, numberOfOperations)) profile(useStore(mutableStore, numberOfOperations)) }
using ImmutableFibonacciStore Execution took 1 seconds using MutableFibonacciStore Execution took 4 seconds
No comments:
Post a Comment