3

イテレータ非同期メソッドの両方が、yield/await 操作の間で状態を維持するためのステート マシンを作成し、メソッド内のすべてのローカルがステート マシン タイプのそのインスタンスのフィールドになります。

このトークでは、Stephen Toub が、async メソッドの本体でローカル変数を少なくすることが、await 呼び出しが多い場合に有効な (マイクロではない) 最適化であると語っています。(つまり、ループで待機している場合)

したがって、この場合、7 つのローカルを持つ場合とTuple<T1, T2, T3, T4, T5, T6, T7>.

明らかに、イテレータにyieldが1つしかない場合、またはasyncメソッドにawaitが1つしかない場合、物事を複雑にするだけですが、数千以上になると、タプル(またはフィールドをラップする他のタイプ)を使用すると思いますか? )何か良いことはありますか?

それとも、何も達成しないか、使用するには少なすぎるマイクロ最適化の試みでしょうか?

編集:もう一度考えてみると、それがうまくいくなら、それはすでにそのように実装されていると思います。とはいえ、まだまだ気になるところです。

4

1 に答える 1

2

何千もの await/yield がある場合、何かがすでに非常に間違っています。また、この 2 つは実装が異なることにも注意してください。ただし、タプルに変更しても、有用なものは何も追加されません.IMO. どちらの場合でも、その参照が次のいずれであるかに関係なく、単一の参照を (状態として) 格納しています。

  • イテレータインスタンス
  • キャプチャー変数コンテキスト
  • タプル
  • タプルのキャプチャー変数コンテキスト

しかし、タプルを使用することで、変数を変更する必要があるときはいつでも新しいインスタンスが必要になることが保証されます。

Tulleは、非同期を手動で実装する場合 (ContinueWith など) により興味深いものになる可能性がありますが、コンパイラを使用して実装を提供する場合は、それほど価値があるとは思いません。

于 2012-10-20T07:49:16.380 に答える