マップをplus2で使用していますか?スレッドコンテキストのオーバーヘッドを追加しますか? 新しいランナブルなどを作成しますか? Future
(DefaultPromise
経由)のデフォルトの実装上の
map
は、次のとおりです。
onComplete
は新しい
CallableRunnable
を作成し、最終的に呼び出します
def map[S](f: T => S)(implicit executor: ExecutionContext): Future[S] = { // transform(f, identity)
val p = Promise[S]()
onComplete { v => p complete (v map f) }
p.future
}
dispatchOrAddCallback
:への呼び出しをディスパッチ
/** Tries to add the callback, if already completed, it dispatches the callback to be executed.
* Used by `onComplete()` to add callbacks to a promise and by `link()` to transfer callbacks
* to the root promise when linking two promises togehter.
*/
@tailrec
private def dispatchOrAddCallback(runnable: CallbackRunnable[T]): Unit = {
getState match {
case r: Try[_] => runnable.executeWithValue(r.asInstanceOf[Try[T]])
case _: DefaultPromise[_] => compressedRoot().dispatchOrAddCallback(runnable)
case listeners: List[_] => if (updateState(listeners, runnable :: listeners))() else dispatchOrAddCallback(runnable)
}
}
基礎となる実行コンテキストこれは、将来の実行方法と場所を決定することが実装ExecutionContext
までであることを意味するので、「それはここやそこに走る」という決定論的な答えを与えることはできません。 Promise
とコールバックオブジェクトの両方の割り当てがあることがわかります。一般的に
私は、コードをベンチマークし、これがボトルネックであることが判明していない限り、私は、このことを心配しません。時間の無制限の量が2行のコードの間に経過することができるので
*あなたは、これはあなたのコードのベンチマークからのオーバーヘッドで決定した*スレッドコンテキストの切り替えに伴うオーバーヘッドを回避するには? –
同じスレッドで実行したい場合は、 'Future {plus2(plus1(x))}'を実行してください。あるいは単に 'PLUS2(PLUS1(X))' ...だけでなく、将来を作成するための「オーバーヘッド」を避けるために:) – Dima
@YuvalItzchakovありませんが、私は、ベンチマークのコードをしませんでした。私はその質問を言い換えるつもりです。 – Michael