あなたの熱意を弱めようとしているわけではありませんが、これはすでに十分に理解されている問題です。以下で何が期待できるかを説明しようと思います。しかし、あなたのプロジェクトを別の地域で行う方が良いかもしれません。「MD5 ハッシュ スループットの最大化」についてはどうですか。スレッドを見るだけに制限されることはありません。
プロジェクトを作成するときは、並列処理が適切な場合とそうでない場合について、何らかの分析を提供する必要があると思います。
CPU が別のスレッドに変更されるたびに、現在のスレッド コンテキストを保持し、新しいスレッド コンテキストをロードする必要があります。このオーバーヘッドは、シングル スレッド プロセスでは発生しません (ガベージ コレクションなどのマネージド サービスを除く)。したがって、他のすべてが等しい場合、スレッドを追加してもパフォーマンスは向上しません。これは、元のワークロードに加えてすべてのコンテキスト切り替えを実行する必要があるためです。
ただし、複数の CPU (コア) を自由に使用できる場合、CPU ごとに 1 つのスレッドを作成すると、コンテキスト切り替えのコストを発生させずに計算を並列化できます。CPU よりも多くのスレッドがある場合、コンテキストの切り替えが問題になります。
計算には、IO バウンドと計算バウンドの 2 つのクラスがあります。IO バウンドの計算では、ネットワーク カードやハードディスクなどのハードウェアからの応答を待機するために大量の CPU サイクルが費やされる可能性があります。このオーバーヘッドにより、CPU が再び最大になるポイントまでスレッドの数を増やすことができ、これによりコンテキスト切り替えのコストをキャンセルできます。ただし、スレッドの数には制限があり、それを超えると、スレッドが IO のブロックに費やすよりもコンテキストの切り替えに時間がかかります。
コンピューティング バウンドの計算では、単純に計算処理に CPU 時間が必要です。これは、パスワード クラッカーが使用する種類の計算です。コンピューティング バウンドの操作はブロックされないため、CPU よりも多くのスレッドを追加すると、全体的なスループットが低下します。
C# ThreadPoolは、既にこれらすべてを処理しています。タスクを追加するだけで、スレッドが使用可能になるまでそれらをキューに入れます。新しいスレッドは、スレッドがブロックされたときにのみ作成されます。そうすれば、コンテキストの切り替えが最小限に抑えられます。
私はクアッドコア マシンを使用しています。問題を 4 つのスレッドに分割し、それぞれが独自のコアで実行すると、私のマシンがパスワードをブルート フォースできるのとほぼ同じくらい高速になります。
この問題を真剣に並列化するには、多くの CPU が必要になります。グラフィックス カードの GPU を使用してこの問題に対処することについて読んだことがあります。
ここに書いた攻撃ベクトルの分析があります。レインボー テーブルとプロセッサ/メモリのトレードオフは、プロジェクトを実行するためのもう 1 つの興味深い領域です。