最初に並列化し、後で C# で Web サービスとして開発したいシミュレーション エンジンがあります。これは大量の CPU と RAM を必要とする集中的なシミュレーションであり、各実行を個別のスレッドに分割したいと考えています。より良いアイデアを提供するために、シミュレーションは 100 回実行でき、実行ごとにいくつかの結果を収集します。各実行から結果を収集し、それらを 1 つの大きなファイルにまとめるのは簡単です。たとえば、4 つのコアを備えたマルチコア マシンを使用している場合、各コアで 4 つの実行を実行し、次に別の 4 つの実行を実行するというアイデアです。3.5 で同じことを達成できますか、それとも 4.0 に移行した方がよいでしょうか? また、これを Web サービスにする場合に注意することはありますか? さらなるアイデアや提案は大歓迎です。
1 に答える
4.0 に移行して TPL を使用する方がよいでしょう。そうすれば、Task<> を作成して各シミュレーションを実行し、リソースが利用可能になったときに TPL スケジューラに適切にスケジュールさせることができます。実行が終了すると、結果を ConcurrentCollection<> に入れることができ、すべてが終了したら、それらに対して照合を実行できます (これが重要であることが判明した場合は、他の実行中に別のタスクを照合することもできます。
3.5 では、スケジューリング作業の多くがあなたに任されており、API はタスクを作成するためのものではありません。また、結果の照合をはるかに簡単にする可能性のある並行コレクションもありません (正確でパフォーマンスの高い並行コレクションを作成する複雑さを決して過小評価しないでください)。
これを Web サービスにする場合は、サービスの使用方法と、それが Web サービスに与える影響を理解する必要があります。基本的に、個々のリクエストのレイテンシを改善できますが、これには全体的なスループットの低下という代償が伴う場合があります。これに関する議論については、次のリンクを参照してください。
http://blogs.msdn.com/b/pfxteam/archive/2010/02/08/9960003.aspx