我的第一个PLINQ尝试

  本人对LINQ这东西有极大的兴趣,很喜欢LINQ这种查询语法。在看了晴天猪“《Effective C#》读书笔记——条目8:推荐使用查询语法而不是循环<C#语言习惯> ”文章后忍不住尝试了一把。

  1.生成接下来要使用的测试数据

 1 //生成数据
 2         private static List<int> getList()
 3         {
 4             List<int> vals1 = new List<int>();
 5             for (int i = 0; i < 50; i++)
 6             {
 7                 int a = new Random().Next(0, 10000);
 8                 Thread.Sleep(30);
 9                 vals1.Add(a);
10             }
11             return vals1;
12         }

  2.使用循环,也就是“命令式”的

 1             List<int> vals = getList();
 2 
 3             Stopwatch sw = new Stopwatch();
 4             sw.Start();
 5 
 6             //用循环的方式对数据进行平方运算
 7             for (int i = 0; i < vals.Count; i++)
 8             {
 9                 vals[i] *= vals[i];
10             }
11 
12             //循环的方式打印出结果
13             foreach (var item in vals)
14             {
15                 Console.Write(item + " ");
16             }
17             sw.Stop();
18             //耗时
19             long time = sw.ElapsedTicks;
20             Console.WriteLine("耗时: " + time.ToString());

  “命令式”也就是传统的循环查询

  3.不使用循环,使用查询语法,也就是“声明式”的

 1 Stopwatch sw1 = new Stopwatch();
 2 
 3             List<int> vals1 = getList();
 4 
 5             sw1.Start();
 6 
 7             //使用查询将列表中的数据执行平方操作
 8             //要使用PLINQ时,要在数据源上调用 AsParallel() 扩展方法来选择使用 PLINQ
 9             var v = (from a in vals1 select a * a).AsParallel();
10 
11             //对数据源中的每个元素并行调用指定的操作
12             //遍历数据源并输出每个元素
13             v.ForAll(a => Console.Write(a + " "));
14 
15             sw1.Stop();
16             long time1 = sw1.ElapsedTicks;
17             Console.WriteLine("耗时: " + time1.ToString());

  从上面给出的这两个例子可以明显看出“查询语法”方式写的代码看着比较舒服吧,行数就比循环的少,呵呵,LINQ。代码可读性也比“命令式”的编程要好。

  测试截图:

    使用循环的:

        

       使用查询语法的:

    

   虽然说数据每次生成的不一样,计算的耗时可能也不同,但是循环的耗时为10145 而查询语法的为132278,显然不是一个数量级的。

   可以看出使用循环执行速度比使用查询语法的速度要快,但是使用查询语法写出来的代码可读性比较高,较使用循环的容易理解。写的不一定好也不一定全对,但我还会继续往下学习,希望各位大虾们提出意见或建议。

 

原文地址:https://www.cnblogs.com/g1mist/p/3041309.html