2012-10-20 39 views
3

两个iteratorsasync methods内部使用的元组保持产量的状态创建一个状态机/等待操作和在你的方法每当地状态机类型的该实例成为迭代器块和异步块

this talk,斯蒂芬Toub谈到在异步方法的机构具有较少的局部变量是有效的(无微)优化,如果你有很多等待来电。 (即如果你正在等待一个循环)

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

显然,它只是给的东西,如果只有一个产量在迭代器或只有一个等待在异步方法,但是当涉及到上千或更多,你认为使用元组(或复杂任何其他类型,将包装你的领域)有什么好处?

或者这只是另一个微不足道的优化尝试?

编辑:现在,我又想起它,它应该已经实现这样如果它会有什么好处,我想。尽管如此,我仍然对此感到好奇。

+0

你有没有试过测量这个? – svick

+0

@svick:不,我没有。 –

回答

2

如果您有成千上万的await/yield,那么某件事情已经非常错误。还应该指出的是,两者有不同的实现。但是,更改为元组不会添加任何有用的IMO。你还在存储(如状态)中任一种情况下单个参考,不管这是否是参考:

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

但是,通过使用你保证,你需要一个新的实例,你需要变异变量任何时候的元组。

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

+0

不知道我是否应该删除这个问题,当我发现了“这个?回答:如何初始化一个具有七个字段的类是一种优化,以使状态机具有这些字段?感谢你和+1的说明:) –

+0

顺便说一句,为什么应该有成千上万的收益率意味着什么是错的?如果我为Enumerable.Where调用了包含数千个项目的集合,该怎么办? –

+0

@safak如果你的意思是“在一个循环中”,那么很好 - 没问题!但是,如果你的意思是你有一种方法有千次使用“yield”或“await”的关键字,那么这种方法似乎做得太多了 –