この質問は、理想的には上級ユーザーの意見を求めます。
私はいくつかの数値計算コードを最適化しており、いくつかのプロセッサコアを解放しています。Task.StartNew
それらを効果的に利用するために、非常に短時間の操作(100〜500ミリ秒)のタスク()を使用したきめ細かい並行性を調べています。ここにはUIはまったく含まれていません。
ここで重要な要素の1つは、スレッド作成のオーバーヘッドなしで短期間のタスクのパフォーマンスを向上させるThreadPoolの使用です。ただし、タスクよりもループで考える方が自然なシナリオもあります(Parallel.Forなど)。
タスクがThreadPoolを使用することは理解していますが、Parallel.Forについてはよくわかりません。質問は:
- どのコンストラクトがThreadPoolを利用しますか?
- Parallel.ForはThreadPoolを使用するように構成できますか、それとも常にスレッド作成のオーバーヘッドが発生しますか?
- 主な質問の一部ではありませんが、並列処理を最大化するためのリンクが役立ちます。
この質問は.NET4に固有のものであることに注意してください。現時点では、4.5へのアップグレードはオプションではありません。
更新:
ダニエル・キンズマンのコメントに基づいて、次のことを考慮してください。
System.Threading.Tasks.Parallel.For(0, 100, i => { System.Console.WriteLine("Is ThreadPool @ low priority: " + System.Threading.Thread.CurrentThread.IsThreadPoolThread); });
System.Diagnostics.Process.GetCurrentProcess().PriorityBoostEnabled = true;
System.Diagnostics.Process.GetCurrentProcess().PriorityClass = System.Diagnostics.ProcessPriorityClass.RealTime;
System.Threading.Thread.CurrentThread.Priority = System.Threading.ThreadPriority.Highest;
System.Threading.Tasks.Parallel.For(0, 100, i => { System.Console.WriteLine("Is ThreadPool @ high priority: " + System.Threading.Thread.CurrentThread.IsThreadPoolThread); });
マルチコアマシンを使用している場合、IsThreadPoolThreadは、実行しているアプリケーションの数に応じて、非決定論的な結果を返します。