C# 在迭代器块和异步块中使用元组
和都创建一个状态机,用于在屈服/等待操作之间保持状态,并且方法中的每个局部都成为状态机类型实例中的一个字段 在中,Stephen Toub谈到,如果有大量等待调用,那么在异步方法体中使用较少的局部变量是一种有效的(非微观)优化。(即,如果您正在循环中等待) 因此,在本例中,我想知道7个局部变量和一个局部变量(即C# 在迭代器块和异步块中使用元组,c#,.net,optimization,iterator,async-await,C#,.net,Optimization,Iterator,Async Await,和都创建一个状态机,用于在屈服/等待操作之间保持状态,并且方法中的每个局部都成为状态机类型实例中的一个字段 在中,Stephen Toub谈到,如果有大量等待调用,那么在异步方法体中使用较少的局部变量是一种有效的(非微观)优化。(即,如果您正在循环中等待) 因此,在本例中,我想知道7个局部变量和一个局部变量(即元组)之间的性能差异 显然,如果迭代器中只有一个yield,或者异步方法中只有一个wait,那么它只会使事情复杂化,但是当涉及到数千个或更多的时候,您认为使用元组(或者任何其他将包装字段的
元组)之间的性能差异
显然,如果迭代器中只有一个yield,或者异步方法中只有一个wait,那么它只会使事情复杂化,但是当涉及到数千个或更多的时候,您认为使用元组(或者任何其他将包装字段的类型)有什么好处吗
或者,这仅仅是另一种微优化尝试,它一事无成或太少而无法使用
Edit:现在我又重新考虑了一下,我想如果它能起到任何作用的话,它应该已经以这种方式实现了。尽管如此,我仍然对此感到好奇。如果你有成千上万的等待/收益,那么有些事情已经很不对劲了。还应该注意的是,这两种方法有不同的实现。但是,在我看来,更改为元组并没有添加任何有用的内容。在这两种情况下,您仍然在存储(作为状态)单个引用,无论该引用是否为:
- 迭代器实例
- 捕获的变量上下文
- 元组
- 捕获的变量上下文到元组
但通过使用元组,您可以保证在任何时候需要变异变量时都需要一个新实例
手动实现异步时,Tulle可能更有趣(比如ContinueWith),但我真的认为使用编译器提供实现时不值得这么做。不确定当我发现“duh”时是否应该删除这个问题答:初始化一个包含七个字段的类如何成为使状态机具有这些字段的优化?谢谢你和+1的陈述:)顺便问一句,为什么拥有数千个收益率意味着有什么不对劲?如果我调用Enumerable,那么有数千项的集合在哪里呢?@safak如果你的意思是“在循环中”,那么很好-没问题!然而,如果你的意思是你有一个使用了上千个“收益率”或“等待”关键字的方法,那么这个方法似乎做得太多了。你试过测量这个吗?