在迭代器块和异步块中使用元组

时间:2012-10-20 07:38:53

标签: c# .net optimization iterator async-await

iteratorsasync methods都创建了一个状态机,用于保持yield / await操作之间的状态,并且方法中的每个 local 都变为字段在状态机类型的那个实例中。

this talk中,Stephen Toub谈到在 async方法的主体中使用较少的局部变量是一个有效的(无微观)优化,如果你有很多等待调用。 (即如果你正在等待一个循环)

所以在这种情况下,我想知道7个本地人和一个本地人之间的性能差异是Tuple<T1, T2, T3, T4, T5, T6, T7>

显然,如果迭代器中只有一个 yield ,或者异步方法中只有一个等待,那么它只会使事情变得复杂,但是当涉及到数千或者更多,你认为使用元组(或任何其他类型将包裹你的字段)做任何好事吗?

或者那只是另一种微观优化尝试,无法完成任何事情或者使用不太少?

编辑:现在我再次想到它,如果它能做任何好事,那么它已经实现,我想。尽管如此,我仍然很好奇。

1 个答案:

答案 0 :(得分:2)

如果你有数千个等待/收益,那么事情已经非常错误了。还应注意,两者具有不同的实现方式。但是,更改为元组并不会添加任何有用的东西,IMO。在任何一种情况下,无论是否引用,您仍然存储(作为状态)单个引用:

  • 迭代器实例
  • 捕获变量上下文
  • 一个元组
  • 捕获变量上下文 一个元组

但是通过使用元组,您可以保证在需要改变变量时需要一个新实例。

Tulle 可以在手动实现异步时更有趣(像ContinueWith这样的东西),但我真的认为在使用编译器提供实现时不值得。