You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
await(future) always compiles to future.onComplete(...), even if the future is already completed. (I think so based on the output of scalac --Ymacro-debug-lite in the 2.10 branch.) Why not return the value synchronously if it is already available?
Here's a simple implementation as a macro wrapping await():
def fastAwait[T](fut: Future[T]): T = macro fastAwaitImpl[T]
def fastAwaitImpl[T: c.WeakTypeTag](c: Context)(fut: c.Expr[Future[T]]): c.Expr[T] = {
import c.universe._
val tree = q"{ val f = $fut; if (f.isCompleted) f.value.get.get else await(f) }"
c.Expr[T](tree)
}
I have code that passes very large amounts of short-lived Futures around. Many of these are already completed when awaited. This optimization helps (from initial tests) and I'm considering using it in my code - is there any reason not to do this?