在C#中使用AsParallel没有好处吗?

时间:2016-10-11 07:16:04

标签: c# linq parallel-processing

这是我的示例项目:

        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?似乎更糟糕的是 很开销。

2 个答案:

答案 0 :(得分:4)

使代码并行运行(创建任务,计划和运行)需要花费更多时间,而不是通过并行执行代码获得的优势。

也就是说,这非常清楚并非每个代码都能并行运行。您只能在具有高CPU负载或外部I / O(如HTTP请求)的实质代码段上使用它。

答案 1 :(得分:1)

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

当您使用.AsParallel运行您的func时,您只需为操作添加更多开销。

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