2016-04-25 7 views
0

私は約100000のタスクを実行する必要がありますが、CPU集中型であることを知っていますが、実行時間が短くて済みます。FixedThreadPoolでの実行は、時間がたつにつれて遅くなります

私は私のCPUは、8つのコアを持っているので、私は8を選択ExecutorService executor = Executors.newFixedThreadPool(8);

を使用しています。

はその後、私のタスクを処理するために、それらのすべてを通じてIループ:

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」ではパフォーマンス上の問題ではありません。キューを引き離すことは懸念事項です。必要なもののための 'LinkedBlockingingQueue'は、雷が速くなります。 –

関連する問題