在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?更糟糕的是

在c#中使用AsParallel没有任何好处

让你的代码并行运行(创建一个任务,安排并运行它)比并行执行代码所获得的优势要花费更多的时间。

也就是说,这很清楚地表明并不是每段代码都能从并行运行中获益。您只能在具有高CPU负载或外部I/O(如HTTP请求)的大量代码段上使用它。

取模操作耗时O(1),因为它被认为是一个简单的操作。使用Linq,你得到O(n)的复杂度(实际上你遍历所有东西),这仍然不是那么复杂。

当你用.AsParallel运行你的函数时,你只是给你的动作增加了更多的开销。

尝试使用更复杂的功能和/或任务,实际上需要多个CPU内核,这样您可能会看到明显的差异。