2024-08-19 · C# 基础 · 学习笔记

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();
学习小结:以上是我学习这个知识点时的笔记和心得。技术学习没有捷径,多写多练多踩坑,自然就掌握了。如果这篇笔记对你有帮助,欢迎继续看看其他文章。