web-dev-qa-db-ja.com

JavaでCPUベースのタスクを実行する単純なプログラムに最適なスレッドプールサイズはどれくらいですか?

スレッドプールを使用してタスクを実行しています。タスクは、ほとんどがCPUの数より1大きいサイズのI/Oのビットに基づくCPUです。

Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1)

すべてのタスクをこのエグゼキュータに送信し、他にほとんど何もしない単純なプログラムの場合、OSがスレッドプール内の各スレッドにチャンスを与える機会をより頻繁にCPUにタイムスライスする必要があるため、スレッドプールをこれ以上大きくすると速度が低下すると思います実行します。

それは正しいですか?もしそうなら、これは本当の問題またはほとんど理論的な問題です。つまり、スレッドプールのサイズを1000に増やした場合、大きな違いに気付くでしょう。

13
Paul Taylor

CPUにバインドされたタスクがある場合、スレッドの数を増やすと、オーバーヘッドが増加し、パフォーマンスが低下します。注:待機中のタスクよりも多くのスレッドがあることは、リソースの浪費にすぎませんが、タスクの速度がそれほど遅くなることはありません。

スレッドが多すぎると驚くほどのオーバーヘッドが発生する可能性があるため、1つだけを追加するのではなく、CPUの数の倍数(たとえば、1または2)を使用します。

9
Peter Lawrey

参考までに、この説明を確認してください。

http://codeidol.com/Java/java-concurrency/Applying-Thread-Pools/Sizing-Thread-Pools/

要するに、あなたが持っているもの(No. CPU + 1)は平均して最適です。

9
Alan J Liu