2012-02-14 102 views
0

我一直致力於實現一個推理器,一個複雜的東西。我試圖通過採用並行化的線程來提高性能,但只會增加開銷。java併發性的潛在瓶頸

我的問題是除了顯示器)之外是否還有其他潛在的瓶頸。我從程序中刪除了​​和volatile等所有指標。

我使用java.util.concurrent實用程序,並將數據拆分爲線程的獨立數組。

+1

你在多核機器上測試過嗎? – paislee 2012-02-14 18:01:39

+1

您是否使用VisualVm監控您的應用程序以分析開銷的來源? – 2012-02-14 18:06:44

+0

@paislee:是的,我在八核電腦上運行它,並且通常會生成**最多** 10個線程。 – 2012-02-14 20:35:02

回答

3

你可以做的最有用的想法是確保你的線程執行長序列的獨立工作。這些序列需要比可能發生的開銷(例如1 - 10微秒)要長得多(如1 - 10微秒)。

一個常見的錯誤是將工作分解得太細(在流程中產生大量開銷)。每個核心只需要一個任務來保持每個核心的繁忙。

沒有你想要做什麼以及你如何分手你的工作的大部分細節,很難提出更具體的建議。

+0

嗨@Peter Lawrey,謝謝你的建議。我已經達到了最多3次加速,但是在我添加了一些優化技術之後,單個工作人員的性能提高了很多,而加速消失。我想這就是你說的。你知道'static',沒有'synchronized',成員是否會導致瓶頸? – 2012-02-14 21:54:01

+0

當嘗試修改共享資源時,併發發生瓶頸。您可以閱讀共享資源,而不會出現瓶頸問題。 (讀/寫線程本地資源也不是問題) – 2012-02-15 10:08:18

+0

非常感謝。我會做一個檢查。 – 2012-02-15 20:14:05

2
  • 潛在的瓶頸是創建新線程。如果發生這種情況,您應該考慮使用線程池。
  • 另一個瓶頸可能是通常稱爲方法的數組分配。

您可以使用JProfiler運行您的應用程序來檢測實際的瓶頸。 JProfiler將在加載時測試您的字節碼,併爲您提供內存消耗,運行時性能等方面的深入瞭解。

0

即使只閱讀他們的技術論文,您也可以看看Disruptor深入討論這個問題。