这个问题最好征求高级用户的意见。
我正在优化一些数字运算代码,并有一些空闲的处理器内核。为了有效地利用它们,我正在研究一些使用任务Task.StartNew
(这里根本不涉及 UI。
这里的一个关键元素是使用 ThreadPool,它可以为短期运行的任务带来性能优势,而不会产生线程创建的开销。然而,在某些情况下,更自然地考虑循环而不是任务(例如 Parallel.For)。
我了解任务使用 ThreadPool,但不确定 Parallel.For。问题是:
- 哪些构造使用了 ThreadPool?
- 可以将 Parallel.For 配置为使用 ThreadPool 还是总是会产生线程创建开销?
- 不是主要问题的一部分,但任何与最大化并行性的链接都会有所帮助。
请注意,此问题特定于 .NET 4。目前无法选择升级到 4.5。
更新:
根据 Daniel Kinsman 的评论,考虑以下几点:
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 将根据您运行的应用程序数量返回不确定的结果。