我的第一个PLINQ尝试

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,显然不是一个数量级的。

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

标签