Таким образом, я возился с некоторыми простыми проблемами, чтобы стать лучше в scala, и я написал следующую программу для вычисления простых чисел, используя сито Эратосфена.Когда я увеличил число простых чисел, чтобы найти, я заметил, что мой процессор будет максимальным во время расчета.Теперь я понятия не имею, почему он использует более 1 ядра, и я боялся, что это испортит ответ, но он выглядит правильным при нескольких запусках, поэтому это не должно быть.Я нигде не использую .par, и большая часть всей моей логики находится в недоумении.
Редактировать: я использую scala 2.9.1
object Main {
val MAX_PRIME = 10000000
def main(args: Array[String]) {
println("Generating array")
val primeChecks = scala.collection.mutable.ArrayBuffer.fill(MAX_PRIME + 1)(true)
primeChecks(0) = false
println("Finding primes")
for (
i ← 2 to MAX_PRIME if primeChecks(i);
j ← i * 2 to MAX_PRIME by i
) primeChecks(j) = false
println("Filtering primes")
val primes = for { (status, num) ← primeChecks.zipWithIndex if status } yield num
println("Found %d prime numbers!".format(primes.length))
println("Saving the primes")
val formatter = new java.util.Formatter("primes.txt", "UTF-8")
try {
for (prime ← primes)
formatter.format("%d%n", prime.asInstanceOf[Object])
}
finally {
try { formatter.close } catch { case _ ⇒ }
}
}
}
Редактировать 2: Вы можетеиспользуйте следующий фрагмент в REPL, чтобы получить многопоточное поведение, поэтому оно должно быть из-за простоты понимания (по крайней мере, в scala 2.9.1).
val max = 10000000
val t = scala.collection.mutable.ArrayBuffer.fill(max + 1)(true)
for (
i <- 2 to max if t(i);
j <- i * 2 to max by i
) t(j) = false