実行しているマシンと比較して、必要なスレッドの数を考えないでください。スレッド化は、次のようなプロセスがある場合はいつでも価値があります。
A: 残りのプロセスを待つ必要のない、非常に遅い操作があります。
B: 特定の関数は他の関数よりも高速に実行でき、インラインで実行する必要はありません。
C: 順序に依存しない I/O が大量に発生しています (Web サーバー)。
これらは、スレッドの起動が理にかなっている場合の明らかな例のほんの一部です。したがって、起動するスレッドの数は、実行する予定のアーキテクチャよりも、コードでポップアップするこれらのシナリオの数に大きく依存します。実際、本当に最適化が必要なプロセスを実行していない限り、起動するスレッドの数と比較してアーキテクチャのベンチマークを行っても、数パーセントの追加パフォーマンスしか得られない可能性があります。現代のコンピューターでは、この数はまったく変化しないはずです。
I/O の例を見てみましょう。これが最もメリットが得られるシナリオです。あるプログラムが、ネットワークを介して 200 人のユーザーと対話する必要があると仮定しましょう。ネットワーク I/O が非常に遅い。CPU より数千倍遅い。各ユーザーを順番に処理する場合、最初のユーザーからのデータを待つだけで数千のプロセッサ サイクルが無駄になります。一度に複数のユーザーからの情報を処理できなかったのでしょうか? この場合、約 200 人のユーザーがいて、待機しているデータは、処理できるよりも数千倍遅いことがわかっているため (このデータに対して実行する処理の量が最小限であると仮定して)、次のようにする必要があります。オペレーティング システムが許可する限り多くのスレッドを起動します。
次に、I/O 集約度の低い例を考えてみましょう。いくつかの関数が順番に実行されますが、互いに独立しており、そのうちのいくつかはより高速に実行される可能性があります。たとえば、ディスク I/O が 1 つにあり、別のディスク I/O。この場合、I/O は依然としてかなり高速ですが、ディスクが追いつくのを待って処理時間を浪費することは間違いありません。そのため、処理能力を活用し、無駄なサイクルを最小限に抑えるために、いくつかのスレッドを起動できます。ただし、オペレーティング システムで許可されている限り多くのスレッドを起動すると、分岐予測などのメモリ管理の問題が発生する可能性があります。この場合、あまりにも多くのスレッドを起動すると、実際には最適ではなく、プログラムの速度が低下する可能性があります。ここでは、マシンに搭載されているコアの数について言及していないことに注意してください。異なるアーキテクチャ向けの最適化はそうではありません。価値はありますが、1 つのアーキテクチャを最適化すると、ほとんどのアーキテクチャで最適に近づく可能性があります。繰り返しますが、合理的に最新のすべてのプロセッサを扱っていると仮定します。