私は約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が挿入するための良いパフォーマンスを提供するようだ。
このケースで私が間違っているかもしれない何かのヒントや提案を誰かに教えてもらえますか?
ありがとうございます。
すべてのコア(8)は無料とは思われません。すなわちバックグラウンドサービス、OSシステムもそれらを使用する。プールを減らすようにしてください。6 – HRgiger
ほとんどの場合、スローダウンはキューのバックアップです。エグゼキュータそのものではありません。 – OldCurmudgeon
ヒープを増やすことがどのような問題であるかを簡単に調べる方法です。データが懸念されるよりも速く動く場合。 –