2016-04-25 21 views
0

我有大約100000個任務需要完成,我知道他們是CPU密集型的,但只需要很短的執行時間(當CPU足夠快時)。FixedThreadPool中的執行速度會隨着時間的推移而變慢

我用ExecutorService executor = Executors.newFixedThreadPool(8);

我選擇8,因爲我的CPU有8個內核。

然後通過所有這些過程我的任務,我的循環:

for(Task task : tasks) { 
    executor.submit(new Runnable() { 
    // 1. Text analyzing 
    // 2. Add result to a LinkedBlockingQueue 
    } 
} 

我觀察到的是,前幾十萬的任務,這是非常快。但是,然後,說10K任務已經處理後,速度變得更慢,並且速度更慢...

我試圖理解,但未能弄清楚爲什麼它逐漸變慢。由於任務完成後,資源也將被釋放。所以我預計處理速度應該是穩定的。

然後我發現問題可能屬於我用來存儲任務結果的LinkedBlockingQueue。但似乎LinkedBlockingQueue提供了很好的插入性能。

有人可以給我一些提示或建議我可能在這種情況下做錯了什麼?

謝謝。

+0

我不認爲所有的核心(8)都是免費的。即後臺服務,OS系統也在使用它們。儘量減少游泳池,即減少到6 – HRgiger

+1

最緩慢的是隊列備份,而不是執行器本身。 – OldCurmudgeon

+0

快速找出問題所在增加堆的方法。如果移動的速度比您關心的數據快。 –

回答

1

該問題屬於LinkedBlockingQueue的性能下降。就我而言,生產者在向隊列中添加數據方面效率更高,而消費者的處理速度太慢。

Java performance problem with LinkedBlockingQueue

+0

請注意,這不是'Queue'的性能問題。這是一個關閉隊列的問題。所需的'LinkedBlockiingQueue'將閃電般快速。 –

相關問題