1234567891011121314151617181920212223242526272829303132333435 |
- import scala.actors.Futures._
- /** @author Axel Busch */
- object EratosthenesFutures {
- def parallel(end : Int, threads: Int) : Array[Boolean] = {
- val sieve = Array.fill[Boolean](end+1)(true)
- for (i <- 2 to scala.math.sqrt(end).toInt) {
- if (sieve(i)) {
- val nextComposite = i*i
- val compositesPerThread = (end-nextComposite+1)/(threads*i)
- val tasks = for (t <- 0 until threads) yield future {
- val begin = nextComposite + t * i *
- compositesPerThread
- val finish = if (t+1 == threads) end
- else nextComposite + (t+1) * i *
- compositesPerThread
- assert (begin % i == 0)
- for (composite <- begin to finish by i) {
- sieve(composite) = false
- }
- }
- awaitAll(20000L, tasks: _*);
- }
- }
- sieve
- }
- def main(args: Array[String]) = {
- val end = 100000000
- for (threads <- List(1,2,4,8)) {
- val startTime = System.currentTimeMillis();
- parallel(end,threads);
- val endTime = System.currentTimeMillis();
- println(threads + " thread: " + (endTime - startTime) + " ms");
- }
- }
- }
|