并行LINQ PLinq

Posted 木色小罗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并行LINQ PLinq相关的知识,希望对你有一定的参考价值。

1、描述

     并行 LINQ (PLINQ) 是 LINQ 模式的并行实现。 PLINQ 查询在许多方面类似于非并行 LINQ to Objects 查询。 PLINQ 尝试充分利用系统中的所有处理器, 它利用所有处理器的方法是,将数据源分成片段,然后在多个处理器上对单独工作线程上的每个片段并行执行查询。 在许多情况下,并行执行意味着查询运行速度显著提高。

PLINQ有两个重要的类:ParallelEnumerable和ParallelQuery.其中, ParallelEnumerable包含许多在ParallelQuery类型上进行操作的扩展方法. ParallelEnumerable同样实现许多在上Enumerable的方法,因为 ParallelQuery 实现IEnumerable接口,使用我们可以很方便的创建ParallelQuery类的一个实例并运用在ParallelEnumerable上实现的并行方法. 做了一简单测试,如下。当数据量大时就能体现出效率差距。

 

2、案例代码以及结果 

 2.1  demoCode

 class Program
    {
        static void Main(string[] args)
        {
            //一般方法
            Test();
           //并行计算方法
            TestAsParallel();
            Console.ReadLine();
        }

        private static void TestAsParallel()
        {
            Console.WriteLine($"并行查询开始");
            var t1 = DateTime.Now;
            
            int[] source = new int[100000000];
            for (int i = 0; i < source.Length; i++)

            {

                source[i] = i;

            }
            var presult = source.AsParallel().Select(c => Math.Pow(c, 3));
           var Tspan=   DateTime.Now.Subtract(t1);
          Console.WriteLine($"并行查询耗时{Tspan.TotalSeconds}秒");
        }
        private static void Test()
        {
            Console.WriteLine($"一般查询开始");
            var t1 = DateTime.Now;
            int[] source = new int[100000000];
            var temp = new double[100000000];
            for (int i = 0; i < source.Length; i++)

            {
                source[i] = i;
            }
            for (int i = 0; i < source.Length; i++)
            {
                temp[i]= Math.Pow(source[i], 3);
            }       
            var Tspan = DateTime.Now.Subtract(t1);
            Console.WriteLine($"一般查询耗时{Tspan.TotalSeconds}秒");
        }

    }

 

 2.2 resultOoutput

 

以上是关于并行LINQ PLinq的主要内容,如果未能解决你的问题,请参考以下文章

27.7 并行语言集成查询(PLinq)

何时使用 Parallel.ForEach,何时使用 PLINQ

何时使用 Parallel.ForEach,何时使用 PLINQ

在 PLINQ 中绑定源线程

《C#本质论》读书笔记(18)多线程处理

AsParallel() 的最大并行度