У меня проблема. Я хотел использовать scala.concurrent.ops.replicate для распараллеливания моей программы. Но я узнал, что алгоритм фактически становится намного медленнее. Итак, я написал небольшой тест и получил тот же результат. Итак, вот они.Почему использование репликации происходит гораздо медленнее, чем серийное исполнение?
Серийный код: занимает около 63 секунд, чтобы закончить
object SerTest {
def main(args: Array[String]) {
for(x <- 1 to 10){
for(i <- 1 to 4) {
for(j <- 1 to 100000) {
val a = BigInt(j).isProbablePrime(1000)
if(!a && j == 100000) println(i + " is ready")}}}}}
Параллельное Код: занимает около 161 секунд, чтобы закончить
object ParTest {
def main(args: Array[String]) {
for(x <- 1 to 10){
replicate(1,5) { i =>
for(j <- 1 to 100000) {
val a = BigInt(j).isProbablePrime(1000)
if(!a && j == 100000) println(i + " is ready")}}}}}
Итак, где совершенно очевидно, и неловко ошибок я сделал? :)
Редактировать: Ой, и я запускаю это на Quadcore-CPU. Так что на самом деле это должно быть быстрее :)
Редактировать 2: Из-за ответа Кевина Райт я немного изменил программы, чтобы иметь больше времени для запуска.
Может быть, что-то странное происходит в BigInt.isProbalyPrime? Я заменил эту строку каким-то глупым Fibonacci, и репликативный код действительно быстрее (на двухъядерном). – Debilski
О, ничего себе, ты прав :) Не думал бы об этом. Просто хотел использовать метод, который, как я предполагал, займет некоторое время, чтобы вычислить. Хотя было бы интересно, почему это происходит. Потому что я получаю такое же поведение в своей оригинальной программе, и там я не использую isProbablePrime или что-то в этом роде. –