現在、Javaアプリでマルチスレッドを使用してパフォーマンスを調整しようとしています。マルチCPUコアに分割したい長期実行のシリアルタスクがあります。
基本的に、100.000アイテム/やることのリストがあります。
今の私の質問は、次のことを行う方が良いということです。
オプション1(擬似コード):
for(i = 0; i < 100000; i++){
threadpool.submit(new MyCallable("1 thing to do"))
}
これにより、スレッドプールのキュー(現在のLinkedBlockingQueue)に100000の実行可能ファイル/呼び出し可能オブジェクトが追加されます。
または、より良い方法です: オプション2(擬似コード)
for(i = 0; i < 4; i++){
threadpool.submit(new MyCallable("25000 things to do"))
}
すでにオプション1を試しましたが、パフォーマンスの向上は見られませんでしたが、複数のスレッドが狂ったように機能し、4つのCPUコアが使用されていることがはっきりとわかります。しかし、私の感じでは、多くのタスクがあるため、オプション1にはいくらかのオーバーヘッドがあります。オプション2はまだ試していませんが、オーバーヘッドが少ないのでスピードアップできると思います。基本的に、リストを100000個の単一アイテムではなく、4つの大きなチャンクに分割しています。
これについて何か考えはありますか?
ありがとう