Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

📚 The CoCalc Library - books, templates and other resources

132937 views
License: OTHER
1
import scala.actors.Futures._
2
/** @author Axel Busch */
3
object EratosthenesFutures {
4
def parallel(end : Int, threads: Int) : Array[Boolean] = {
5
val sieve = Array.fill[Boolean](end+1)(true)
6
for (i <- 2 to scala.math.sqrt(end).toInt) {
7
if (sieve(i)) {
8
val nextComposite = i*i
9
val compositesPerThread = (end-nextComposite+1)/(threads*i)
10
val tasks = for (t <- 0 until threads) yield future {
11
val begin = nextComposite + t * i *
12
compositesPerThread
13
val finish = if (t+1 == threads) end
14
else nextComposite + (t+1) * i *
15
compositesPerThread
16
assert (begin % i == 0)
17
for (composite <- begin to finish by i) {
18
sieve(composite) = false
19
}
20
}
21
awaitAll(20000L, tasks: _*);
22
}
23
}
24
sieve
25
}
26
def main(args: Array[String]) = {
27
val end = 100000000
28
for (threads <- List(1,2,4,8)) {
29
val startTime = System.currentTimeMillis();
30
parallel(end,threads);
31
val endTime = System.currentTimeMillis();
32
println(threads + " thread: " + (endTime - startTime) + " ms");
33
}
34
}
35
}
36