2014-08-28 69 views
-2

我在客戶端(生產者)和服務器端的一個線程(消費者)8線程什麼是更快的一個併發隊列或8個無鎖隊列?

消費者線程正在旋轉檢查新數據到達。我有兩個選擇來實現這一點:

因爲我認爲檢查8個無鎖查詢必須比檢查一個阻塞隊列快得多(因爲阻塞是昂貴的!)。所以我傾向於使用8 spsc_queue。如果我是對的,你能提出什麼建議?

+1

不知道。當你測試每個選項時哪個更快? – admdrew 2014-08-28 19:33:50

+0

您可以通過不旋轉來加快速度。 – juanchopanza 2014-08-28 19:46:15

+0

您需要執行多少次測試以確保法拉利比驢子快? – javapowered 2014-08-28 19:47:34

回答

1

答案很大程度上取決於您的系統架構。所以首先,請與harware_concrurrency()如果你的8個線程可能在parrallel真正運行:

  • ,如果你有足夠的硬件核心(如果他們不採取其他進程),您的紡紗實際上可能提高吞吐量通過使用所有硬件容量在客戶端大小上。在這種情況下,單個鎖定隊列會降低客戶端核心速度:隊列同步可能是他們的瓶頸,迫使他們依次運行。如果你有8個單獨的隊列,只有一個隊列會被消費者放慢速度。

  • 如果不是,那麼每個線程將一直等待其他人在工作。在這種情況下,單個鎖定隊列不應對整​​體性能產生重大影響。但是旋轉並不會提高性能(事實上,上下文切換可能會減少一點),應該考慮到批判性思維。

  • 在這兩種情況下,單個消費者一次只能處理一件物品。對於消費它不應該產生巨大的變化,如果它從8個隊列或從1

讀取但是當你看到這件事很複雜。如果生產者以不同的速度運行(更高的優先級或其他處理器,或者消費代碼比生產代碼短得多),則需要重新考慮分析。所以建議預見一些基準(端到端吞吐量)。