【发布时间】:2018-03-11 23:43:47
【问题描述】:
我正在阅读Akka cookbook 并发现在一个示例中提高功能性能很有趣。
我有下一个客户对象:
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)
}
还有两个actor类的实现。
第一:
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 )
}
}
第二:
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))
}
}
在我的机器上,First 变体在 0.12 毫秒内执行,Second 在 360 毫秒内执行。所以Second 慢了 300 倍。使用 htop 我发现 First 变体在第二种情况下使用 1 个核心来对抗所有 4 个核心。
是不是因为生成了太多异步任务?以及如何加速fib(n: Int)方法?
【问题讨论】:
标签: scala asynchronous akka-actor