我試圖使用工作線程來加速更大的算法,當我發現在更多的線程上使用獨立的優先級隊列實際上會降低性能。於是我寫了一個小測試用例。緩慢的工作線程性能與優先級隊列
在其中我查詢要啓動多少個線程,將每個線程設置爲它自己的處理器,並從我的優先級隊列中推送和彈出很多東西。每個線程都擁有自己的優先級隊列,並且它們分開分配,所以我不懷疑虛假分享。
我把測試用例here,因爲它比片段更長。 (處理器關聯位來自NCrunch)
優先級隊列是我自己創建的,因爲.NET沒有內置隊列。如果這有什麼不同,它使用Pairing Heap。
無論如何,如果我用一個線程和一個核心運行程序,它會獲得大約100%的使用率。 兩根線程/兩個核心的使用率下降
最終,所有8個核心的使用率降至30%。
這是一個問題,因爲性能的下降會使任何操作都無效,這將會從多線程中獲益。什麼導致性能下降?每個隊列完全獨立於另一個線程
如果您運行的物理內核很少(並且啓用了超線程),那可能都是正常的。請參閱http://superuser.com/questions/133082/hyper-threading-and-dual-core-whats-the-difference和http://superuser.com/questions/420329/single-threaded-program-takes-too -low-cpu – 2013-02-19 16:53:11
嗯,我將不得不嘗試禁用超線程。但是,如果我做一些像http://stackoverflow.com/questions/39395/how-do-i-calculate-pi-in-c計算Pi,我全面獲得100%。 – Tocs 2013-02-19 17:02:48
@Tocs請發佈你的結果 - 我一直有類似的問題,並沒有意識到超線程可能是責備。 – AngryHacker 2013-02-19 17:44:48