リモートホストでSSLソケットを作成するJavaアプリケーションがあります。プロセスを早めるためにスレッドを採用したいと思います。
プログラムのパフォーマンスに影響を与えない最大限の使用率が必要です。使用するスレッドの適切な数をどのように決定できますか?次の行を実行した後:Runtime.getRuntime().availableProcessors();
私は4を取得しました。私のプロセッサは8GBのRAMを搭載したIntelコアi7です。
リモートホストでSSLソケットを作成するJavaアプリケーションがあります。プロセスを早めるためにスレッドを採用したいと思います。
プログラムのパフォーマンスに影響を与えない最大限の使用率が必要です。使用するスレッドの適切な数をどのように決定できますか?次の行を実行した後:Runtime.getRuntime().availableProcessors();
私は4を取得しました。私のプロセッサは8GBのRAMを搭載したIntelコアi7です。
4つのコアがある場合、理論的には、最大の最適化のために、常に4つのワーカースレッドを実行する必要があります。残念ながら、理論的に起こることは実際には決して起こりません。何らかの理由でかなりのダウンタイムが発生するワーカースレッドがある場合があります。おそらく、彼らはより多くのデータを求めてWebにアクセスしている、またはディスクから読み取っています。その多くは待機しており、CPUを利用していません。
あなたがしている待機の量に応じて、あなたは数を増やしたいと思うでしょう。スレッドの数を増やすためのコストは、コンテキストの切り替えとリソースの競合が増えることです。利点は、他のスレッドの1つが何かのために中断する必要があると判断した場合に備えて、別のスレッドを使用できるようにすることです。
あなたの最善の策は、それを何かに設定し(4から始めましょう)、上に向かって進むことです。各設定でコードのプロファイルを作成し、ベンチマークが上がるか下がるかを確認します。すぐにパターンと損益分岐点が表示されるはずです。
最適化に関しては、何が最速であるかについて必要なすべてを理論化できますが、この質問に真に答えるためにコードを実際に実行してタイミングを合わせることに勝るものはありません。
DarthVaderが言ったように、ThreadPool(CachedThreadPool
)を使用できます。この構成では、スレッドの具体的な数を指定する必要はありません。
オラクルサイトから:
多分それはあなたが探しているものです。コアの数については言うのは難しいです。4つのハイパースレッディングコアがあり、少なくとも1つのコアをOS用に残しておく必要があります。私は4-6スレッドと言うでしょう。