Parallel 与 PLINQ
Parallel.ForEach 和 PLINQ 提供数据并行能力,适合 CPU 密集型任务同时用多核。但并行不是免费的,有线程调度开销,任务太小时反而比串行慢。
自己处理大批量数据时用 Parallel.ForEach 明显快很多。但要注意线程安全:多个线程同时写共享变量要加锁。
注意:1) CPU 密集用并行,IO 密集用 async;2) 不要在并行循环里做 UI 操作;3) degreeOfParallelism 控制并发数。
代码示例
using System.Diagnostics;
var items = Enumerable.Range(1, 100000).ToList();
// 串行
var sw1 = Stopwatch.StartNew();
foreach (var item in items)
{
Math.Sqrt(item); // CPU 密集操作
}
sw1.Stop();
// Parallel 并行
var sw2 = Stopwatch.StartNew();
Parallel.ForEach(items, new ParallelOptions
{
MaxDegreeOfParallelism = Environment.ProcessorCount
}, item =>
{
Math.Sqrt(item);
});
sw2.Stop();
Console.WriteLine("串行:" + sw1.ElapsedMilliseconds + "ms");
Console.WriteLine("并行:" + sw2.ElapsedMilliseconds + "ms");
// PLINQ
var squares = items.AsParallel()
.Where(x => x % 2 == 0)
.Select(x => x * x)
.ToList();
学习小结:以上是我学习这个知识点时的笔记和心得。技术学习没有捷径,多写多练多踩坑,自然就掌握了。如果这篇笔记对你有帮助,欢迎继续看看其他文章。