From 213fa616a8aaf6bbd7a489db023db0e7d1e3a842 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johan=20=22Party=20Cannon=22=20Andr=C3=A9n?= Date: Fri, 2 Dec 2016 11:08:15 +0100 Subject: [PATCH] Eliminate the allocation on each aroundRecieve #20748 --- .../src/main/scala/akka/actor/Actor.scala | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/akka-actor/src/main/scala/akka/actor/Actor.scala b/akka-actor/src/main/scala/akka/actor/Actor.scala index f0e766e410..1d072f387e 100644 --- a/akka-actor/src/main/scala/akka/actor/Actor.scala +++ b/akka-actor/src/main/scala/akka/actor/Actor.scala @@ -364,6 +364,16 @@ object Actor { * that will be translated to the receiving system's deadLetters. */ final val noSender: ActorRef = null + + /** + * INTERNAL API + */ + private final val NotHandled = new Object + + /** + * INTERNAL API + */ + private final val notHandledFun = (_: Any) ⇒ NotHandled } /** @@ -481,7 +491,12 @@ trait Actor { * @param receive current behavior. * @param msg current message. */ - protected[akka] def aroundReceive(receive: Actor.Receive, msg: Any): Unit = receive.applyOrElse(msg, unhandled) + protected[akka] def aroundReceive(receive: Actor.Receive, msg: Any): Unit = { + // optimization: avoid allocation of lambda + if (receive.applyOrElse(msg, Actor.notHandledFun).asInstanceOf[AnyRef] eq Actor.NotHandled) { + unhandled(msg) + } + } /** * Can be overridden to intercept calls to `preStart`. Calls `preStart` by default.