2

我正在使用jdk 7的新forkjoin框架。 我得到一個任務,它必須用不同的參數多次執行。使用jdk 7的新fork連接框架的性能問題

此任務延伸RecursiveTask。有超過100個任務可以執行,可以同時執行。任務是獨立的,所以不需要任何同步。 因此,我首先創建了所需的任務,並將它們傳遞給forkjoin線程池。 但是應用程序變得比較慢,沒有任何並行性運行它。

我的第一個想法是,我創造了很多線程..這就是爲什麼我試圖回收線程以減少對象創建開銷,但這對性能沒有影響。用於使用reinitialize()方法回收即時消息。再循環性能比沒有任何並行性運行性能要慢。

在任務中執行的操作不是微不足道的,運行線程的持續時間從5到150毫秒。該應用程序運行在雙核機器上,使用ubuntu和oracle jdk 7運行。

+0

你有沒有建立一個簡單的程序,簡單地派生一個任務,並等待其完成,與線程做零工作,得到上下文切換時間的感覺?你知道那些時代是什麼嗎? – 2012-08-04 15:19:44

+0

...你會注意到與2個處理器,你的加速是至多2倍。你確定你需要100個獨立的任務? – 2012-08-04 15:21:00

+0

我會嘗試你的第一個評論:)如上所述,即時通訊不再使用100個獨立的線程。我創建了一個固定數量的線程,這些線程是延伸RecursiveTask 的對象,如許多示例中所示。 2.之後,我設置這些對象的參數並將它們傳遞給池,以便同時運行。之後,我重新設置參數,只要元素可用,必須執行任務。 – lunatikz 2012-08-04 15:29:52

回答

0

CoopSoft的Edward Harned發現了用Java實現的Fork/Join設計的許多問題。

特別是,「偷工減料」遭受高度爭議&在圍繞多個處理器進行工作時效率低下。遞歸分解也不是特別有效。

如果你的任務是而不是遞歸 - 你說有100個,他們可以同時執行 - 那麼使用ThreadPoolExecutor更簡單的方法可能會更有效。

參見: