在c#中使用AsParallel没有任何好处
本文关键字:任何好 AsParallel | 更新日期: 2023-09-27 18:12:41
下面是我的示例项目:
Console.WriteLine("Elapsed time in milliseconds:");
swSingle.Start();
var numbers2 = Enumerable.Range(0, 100000000);
var singleResult = numbers2
.Where(i => i % 2 == 0)
.ToArray();
swSingle.Stop();
Console.WriteLine("Without AsParallel: {0}", swSingle.ElapsedMilliseconds);
swParallel.Start();
var numbers = Enumerable.Range(0, 100000000);
var parallelResult = numbers.AsParallel()
.Where(i => i % 2 == 0)
.ToArray();
swParallel.Stop();
Console.WriteLine("Using AsParallel: {0}", swParallel.ElapsedMilliseconds);
我的(多核)系统的输出是:
Elapsed time in milliseconds:
Without AsParallel: 1537
Using AsParallel: 2135
为什么我不能在这个示例中获得时间优势通过使用AsParallel?更糟糕的是
让你的代码并行运行(创建一个任务,安排并运行它)比并行执行代码所获得的优势要花费更多的时间。
也就是说,这很清楚地表明并不是每段代码都能从并行运行中获益。您只能在具有高CPU负载或外部I/O(如HTTP请求)的大量代码段上使用它。
取模操作耗时O(1),因为它被认为是一个简单的操作。使用Linq,你得到O(n)的复杂度(实际上你遍历所有东西),这仍然不是那么复杂。
当你用.AsParallel
运行你的函数时,你只是给你的动作增加了更多的开销。
尝试使用更复杂的功能和/或任务,实际上需要多个CPU内核,这样您可能会看到明显的差异。