運行密集型任務時,一個很好的經驗法則是運行與物理核心相同的編號計數。
是的,你可以運行更多的任務,但是他們會等待資源(或線程池中的線程)和你的盒子,無論大小如何,都不能100%全部分配CPU核心資源由於背景/其他進程而產生的線程。因此,實例化的任務越多,產生的線程越多,因爲它們超過了實際可能的併發線程(每個核心1個線程),就會發生更多的資源管理,排隊和交換。
的測試我們做了我工作的地方,現在使用的病毒模式,推出更多的任務發現,最佳的是相當接近CPU數量爲上限。與物理核心數量以一對一比率啓動的任務每個任務需要大約1分鐘才能完成。設置爲CPU計數的兩倍,任務時間從平均1分鐘到平均5分鐘的時間完成。從核心計數開始的任務越多,它的幾何結構就越慢。
因此,舉例來說,如果你有8個物理核心,8個任務(使用TPL,並在活動過程基本上是8個併發線程)應該是最快的。您的主線程或進程會創建其他任務和其他後臺進程,但如果該框相對於您的資源利用愉悅而言非常孤立,那麼這些工作將會非常少。
你嚼過的任務隊列或列表基於核心數量的編程任務帽的上漲空間,所以當你部署在不同大小的盒子的應用程序,它會自動調整自身。
以編程方式確定這一點,我們使用
var CoreCount = System.Environment.ProcessorCount/2;
爲什麼除以2,你問?因爲幾乎所有現代處理器都使用邏輯核心或超線程技術。您應該通過自己的測試發現,如果使用邏輯計數,則每項任務的整體速度以及整個過程將顯着下降。物理內核是關鍵。我們看不到一種快速查找物理與邏輯的方法,但對我們的盒子進行的快速調查發現這一切始終如一。 YMMV,但這可能會讓你的速度非常快。
線程在做什麼? – 2011-01-28 12:43:59
+1好問題。它們每個都發出一個SOAP調用來傳送soem數據並等待它返回 – Mawg 2011-01-28 12:58:52
除了「返回」是異步的,所以它們並不是真的在等待。其他線程可以通過HTTP發送SOAP請求(fcuntion call)後立即運行 – Mawg 2011-01-31 06:29:13