Прогнали пару тестов шуточных и несерьезных методов par scala и asParallel в c#. Результаты получились предсказуемые, но не о них сейчас. Вот код:
trait Calculation[T,R]{
def before():Unit
def calculation(v:T):R
def after():Unit
def start(t:T){
before()
val t1s = System.currentTimeMillis()
calculation(t)
val t2s = System.currentTimeMillis()
println(t2s-t1s)
System.gc
after()
}
}
object Calculation{
def apply[T,R]( _before: =>Unit,
_calculation: (T)=>R,
_after: =>Unit
):Calculation[T,R]=
new Calculation[T,R] {
def calculation(v: T): R = _calculation(v)
def after(): Unit = _after
def before(): Unit = _before
}
}
object Test extends App {
def cpuTimeEater(num:Int)=Math.pow(num,num)
val slt = (0 to 5000000).toArray
val singleClaculation = Calculation(
{println("Single:")},
(x:Array[Int])=>{x map cpuTimeEater},
{println("------------------")}
)
val multiCalculation = Calculation(
{println("Parrallel:")},
(x:Array[Int])=>{x.par map cpuTimeEater},
{println("+++++++++++++++++")}
)
for(i<-(0 to 10)){
singleClaculation.start(slt)
multiCalculation.start(slt)
}
}
Масшабируется на отлично, но можно и лучше, наверное. Смотрим профилировщиком VisualVM(добавить scala.* в непрофилируемые совершенно забыли), а там:
[Method]scala.concurrent.forkjoin.ForkJoinPool.scan(scala.concurrent.forkjoin.ForkJoinPool.WorkQueue)
[SelfTime %]46.511116
[SelfTime ]53 450 ms (46,5%)
[Invocations]122
Гугление выдало вот это с stackoverflow http://stackoverflow.com/questions/19147077/akka-during-load-testing-forkjoin...
Ну и собственно тут подробный коментарий, что оно таки делает. https://github.com/scala/scala/blob/master/src/forkjoin/scala/concurrent/fork...
Но что он так много отжирает то и можно ли на это как-то повлиять?