私はAkka cookbook
を読んでおり、1つのサンプルで機能の性能を向上させることが興味深いことがわかりました。俳優クラスのなぜ非同期計算でプログラムが遅くなるのですか?
object HelloAkkaActorSystem extends App {
implicit val timeout = Timeout(50 seconds)
val actorSystem = ActorSystem("HelloAkka")
val actor = actorSystem.actorOf(Props[FibonacciActor])
// asking for result from actor
val future = (actor ? 6).mapTo[Int]
val st = System.nanoTime()
val fiboacciNumber = Await.result(future, 60 seconds)
println("Elapsed time: " + (System.nanoTime() - st)/math.pow(10, 6))
println(fiboacciNumber)
}
そして、2つの実装: 私は、次のクライアントオブジェクトを持っています。
まず:0.12ミリ、360ミリ秒でSecond
で行わ私のマシンFirst
バリアントで
class FibonacciActor extends Actor {
override def receive: PartialFunction[Any, Unit] = {
case num : Int =>
val fibonacciNumber = fib(num)
val s = sender()
fibonacciNumber.onComplete {
case Success(x) => s ! x
case Failure(e) => s ! -1
}
}
def fib(n : Int) : Future[Int] = n match {
case 0 | 1 => Future{ n }
case _ =>
fib(n-1).flatMap(n_1 =>
fib(n-2).map(n_2 =>
n_1 + n_2))
}
}
:
class FibonacciActor extends Actor {
override def receive: Receive = {
case num : Int =>
val fibonacciNumber = fib(num)
sender ! fibonacciNumber
}
def fib(n : Int) : Int = n match {
case 0 | 1 => n
case _ => fib(n-1) + fib(n-2)
}
}
セカンド。したがって、Second
は300倍遅くなります。 htop
を使用すると、First
バリアントは2番目のすべての4に対して1コアを使用することがわかりました。 あまりにも多くの非同期タスクが生成されるためですか?どのようにfib(n: Int)
方法をスピードアップするには?
答えをいただきありがとうございます。ベンチマークとJVMウォームアップの正しさについては皆さんが書いています。しかし、ベンチマークの結果が正しくない場合でも、どちらの場合も正しくありません。だから、第二の変種が300倍遅くなるという私の仮定は正しい。それは単に競争のためです。私の2番目の質問については、非同期計算で 'fib'メソッドを高速化する方法はありますか? –