2012-10-20 69 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」的關鍵字,那麼這種方法似乎做得太多了 –