我有大約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提供了很好的插入性能。
有人可以給我一些提示或建議我可能在這種情況下做錯了什麼?
謝謝。
我不認爲所有的核心(8)都是免費的。即後臺服務,OS系統也在使用它們。儘量減少游泳池,即減少到6 – HRgiger
最緩慢的是隊列備份,而不是執行器本身。 – OldCurmudgeon
快速找出問題所在增加堆的方法。如果移動的速度比您關心的數據快。 –