2011-03-16 82 views
19

我最近一直在學習F#,特別感興趣的是它容易利用數據並行性。這個成語似乎很容易理解和直接使用,並從中獲得實際價值。爲什麼我不應該使用F#異步工作流進行並行處理?

那麼爲什麼async不是真的是爲了這個? Donald Syme himself表示PLINQ和期貨可能是更好的選擇。我在這裏閱讀的其他答案同意以及推薦TPL。 (只要您使用F#Powerpack獲得PSeq函數,PLINQ與上述內置函數沒有太大區別。)

F#和函數式語言對此很有意義,和some applicationsasync並行取得了巨大成功。

那麼爲什麼不應該我用async來執行並行數據處理?我會通過編寫並行async代碼而不是使用PLINQ或TPL來損失什麼?

回答

11

我寫了一篇文章,使用TaskAsync重新實現了一個C#TPL示例,該示例對兩者之間的差異也有一些評論。你可以find it here,也有更多advanced async-based version

下面是從兩個選項進行比較的第一篇文章報價:

的兩種可能的實現之間的選擇取決於許多因素。異步工作流程是專門爲F#設計的,因此它們更適合於語言。它們爲I/O綁定任務提供更好的性能,並提供更方便的異常處理。而且,順序語法非常方便。另一方面,任務針對CPU綁定計算進行了優化,並且可以更容易地從應用程序的其他位置訪問計算結果,而無需顯式緩存。

+1

首選項摘要然後是I/O - > Async,CPU - > TPL/PLINQ,語法的簡易性 - > Async/PLINQ。從我可以從包括上述文章在內的所有資源中收集的信息,使用Async.Parallel來處理CPU綁定的任務沒有太大的缺點。特別是TPL的排隊和工作分配功能是否使它成爲CPU限制操作的更好選擇? – Gnat 2011-03-17 15:54:34

0

我總是認爲這是TPL,PLinq等......讓你超越Async所做的。 (取消機制是想到的。)This question有一些更好的答案。

本文向TPL提示slight performance advantage,但可能不夠重要。

+0

但是,請注意,文章暗示TPL與Async相比具有一定的性能優勢已經超過3年了 - 在當時情況可能已經發生了很大變化。 – ildjarn 2011-03-16 15:55:53

+2

F#異步具有與TPL相同的取消機制。 – Brian 2011-03-16 16:43:01

15

那麼爲什麼我不應該使用異步來執行並行數據處理呢?

如果您有一小部分完全獨立的非async任務和大量內核,那麼使用異步來實現並行性沒有任何問題。然而,如果你的任務是以任何方式依賴的,或者你的任務比核心更多,或者你在代碼中使用的太遠,那麼你將在桌面上留下很多性能,並且可以通過選擇並行編程的更合適的基礎。

請注意,您的例子可以更優雅地使用TPL從F#雖然這樣寫:

Array.Parallel.map f xs 

我該怎麼寫並行異步代碼,而不是使用PLINQ或TPL損失呢?

你失去了寫緩存忘卻的代碼,因此,將大量的高速緩存未命中的苦,因此,所有核心拖延等待共享內存,這意味着在多核可擴展性差的能力。

TPL基於這樣的想法,即子任務應該以高概率在與其父代相同的核心上執行,因此,將因重用相同數據而受益,因爲它在本地CPU高速緩存中很熱。 async沒有這樣的保證。

相關問題