C#并行和合买平台搭建并行集合和PLinq
2021-03-26 17:26
标签:break console set msdn 访问 sed tom art rest 并行算法的出现,随之而产生的也就有了并行集合,及线程安全集合;微软向的也算周到,没有忘记linq,也推出了linq的并行版本,plinq - Parallel Linq. 一、并行集合 —— 线程安全集合 并行计算使用的多个线程同时进行计算,所以要控制每个线程对资源的访问,我们先来看一下平时常用的List 复制代码 using System; namespace ThreadPool 复制代码 点击F5运行,得到如下结果: 看到结果中显示的5851,但是我们循环的是10000次啊!怎么结果不对呢?这是因为List 下面我们来看下并行集合 —— 线程安全集合,在System.Collections.Concurrent命名空间中,首先来看一下ConcurrentBag 复制代码 public static void ConcurrentBagWithPallel() 复制代码 同时执行两个方法,结果如下: 可以看到,ConcurrentBag集合的结果是正确的。下面我们修改代码看看ConcurrentBag里面的数据到底是怎么存放的,修改代码如下: 复制代码 public static void ConcurrentBagWithPallel() 复制代码 先来看一下运行结果: 可以看到,ConcurrentBag中的数据并不是按照顺序排列的,顺序是乱的,随机的。我们平时使用的Max、First、Last等linq方法都还有。其时分类似Enumerable的用法,大家可以参考微软的MSDN了解它的具体用法。 关于线程安全的集合还有很多,和我们平时用的集合都差不多,比如类似Dictionary的ConcurrentDictionary,还有ConcurrentStack,ConcurrentQueue等。 二、Parallel Linq的用法及性能 1、AsParallel 前面了解了并行的For和foreach,今天就来看一下Linq的并行版本是怎么样吧?为了测试,我们添加一个Custom类,代码如下: public class Custom 写如下测试代码: 复制代码 public static void TestPLinq() 复制代码 其实也就是加了一个AsParallel()方法,下面来看下运行结果: 时间相差了一倍,不过有时候不会相差这么多,要看系统当前的资源利用率。大家可以多测试一下。 其实,AsParallel()这个方法可以应用与任何集合,包括List 2、GroupBy方法 在项目中,我们经常要对数据做处理,比如分组统计,我们知道在linq中也可以实现,今天来学习一下新的ToLookup方法,写一个测试方法,代码如下: 复制代码 public static void OrderByTest() 复制代码 运行结果如下: ToLookup方法是将集合转换成一个只读集合,所以在大数据量分组时性能优于List.大家可以查阅相关资料,这里由于篇幅问题,不再细说。 C#并行和合买平台搭建并行集合和PLinq 标签:break console set msdn 访问 sed tom art rest 原文地址:http://blog.51cto.com/13890757/2151164
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.Concurrent;
{
public class PEnumerable
{
public static void ListWithParallel()
{
List
Parallel.For(0, 10000, item =>
{
list.Add(item);
});
Console.WriteLine("List‘s count is {0}",list.Count());
}
}
}
{
ConcurrentBag
Parallel.For(0, 10000, item =>
{
list.Add(item);
});
Console.WriteLine("ConcurrentBag‘s count is {0}", list.Count());
}
{
ConcurrentBag
Parallel.For(0, 10000, item =>
{
list.Add(item);
});
Console.WriteLine("ConcurrentBag‘s count is {0}", list.Count());
int n = 0;
foreach(int i in list)
{
if (n > 10)
break;
n++;
Console.WriteLine("Item[{0}] = {1}",n,i);
}
Console.WriteLine("ConcurrentBag‘s max item is {0}", list.Max()); }
{
public string Name { get; set; }
public int Age { get; set; }
public string Address { get; set; }
}
{
Stopwatch sw = new Stopwatch();
List
for (int i = 0; i {
customs.Add(new Custom() { Name = "Jack", Age = 21, Address = "NewYork" });
customs.Add(new Custom() { Name = "Jime", Age = 26, Address = "China" });
customs.Add(new Custom() { Name = "Tina", Age = 29, Address = "ShangHai" });
customs.Add(new Custom() { Name = "Luo", Age = 30, Address = "Beijing" });
customs.Add(new Custom() { Name = "Wang", Age = 60, Address = "Guangdong" });
customs.Add(new Custom() { Name = "Feng", Age = 25, Address = "YunNan" });
} sw.Start();
var result = customs.Where
{
Stopwatch stopWatch = new Stopwatch();
List
for (int i = 0; i {
customs.Add(new Custom() { Name = "Jack", Age = 21, Address = "NewYork" });
customs.Add(new Custom() { Name = "Jime", Age = 26, Address = "China" });
customs.Add(new Custom() { Name = "Tina", Age = 29, Address = "ShangHai" });
customs.Add(new Custom() { Name = "Luo", Age = 30, Address = "Beijing" });
customs.Add(new Custom() { Name = "Wang", Age = 60, Address = "Guangdong" });
customs.Add(new Custom() { Name = "Feng", Age = 25, Address = "YunNan" });
} stopWatch.Restart();
var groupByAge = customs.GroupBy(item => item.Age).ToList();
foreach (var item in groupByAge)
{
Console.WriteLine("Age={0},count = {1}", item.Key, item.Count());
}
stopWatch.Stop();
Console.WriteLine("Linq group by time is: " + stopWatch.ElapsedMilliseconds);
stopWatch.Restart();
var lookupList = customs.ToLookup(i => i.Age);
foreach (var item in lookupList)
{
Console.WriteLine("LookUP:Age={0},count = {1}", item.Key, item.Count());
}
stopWatch.Stop();
Console.WriteLine("LookUp group by time is: " + stopWatch.ElapsedMilliseconds);
}
文章标题:C#并行和合买平台搭建并行集合和PLinq
文章链接:http://soscw.com/index.php/essay/68207.html