Не редкость в задачах проекта Эйлера, похоже, эквивалентна:
Stream.from(1).map(f).takeWhile((_>0)).foldLeft(0L)(_+_)
где f - некоторая дорогостоящая в вычислении функция который возвращает положительные значения до некоторой неизвестной точки и после этого возвращает нули.
Мне нравится распараллеливать вещи, особенно когда параллельные коллекции Scala и .par
делают это так просто. Но в отсутствие ParStream лучшее, что я придумал, это:
val BATCH=1024
Stream.from(1,BATCH).flatMap(
i=>(i until i+BATCH).par.map(f)
).takeWhile((_>0)).foldLeft(0L)(_+_)
, который не выглядит очень элегантным и чувствителен к выбору значения BATCH
(но может дать увеличение скорости в 4 раза). на моем четырехъядернике).
Есть ли предложения по более чистым способам достижения того же результата?