C#并行和合买平台搭建并行集合和PLinq
合买平台搭建
并行算法的出现,随之而产生的也就有了并行集合,及线程安全集合;微软向的也算周到,没有忘记linq,也推出了linq的并行版本,plinq - Parallel Linq.
一、并行集合 —— 线程安全集合
并行计算使用的多个线程同时进行计算,所以要控制每个线程对资源的访问,我们先来看一下平时常用的List<T>集合,在并行计算下的表现,新建一个控制台应用程序,添加一个PEnumerable类(当然你也直接写到main方法里面测试,建议分开写),写如下方法:
复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.Concurrent;
namespace ThreadPool
{
public class PEnumerable
{
public static void ListWithParallel()
{
List<int> list = new List<int>();
Parallel.For(0, 10000, item =>
{
list.Add(item);
});
Console.WriteLine("List's count is {0}",list.Count());
}
}
}
复制代码
点击F5运行,得到如下结果:
看到结果中显示的5851,但是我们循环的是10000次啊!怎么结果不对呢?这是因为List<T>是非线程安全集合,意思就是说所有的线程都可以修改他的值。
下面我们来看下并行集合 —— 线程安全集合,在System.Collections.Concurrent命名空间中,首先来看一下ConcurrentBag<T>泛型集合,其用法和List<T>类似,先来写个方法测试一下:
复制代码
public static void ConcurrentBagWithPallel()
{
ConcurrentBag<int> list = new ConcurrentBag<int>();
Parallel.For(0, 10000, item =>
{
list.Add(item);
});
Console.WriteLine("ConcurrentBag's count is {0}", list.Count());
}
复制代码
同时执行两个方法,结果如下:
可以看到,ConcurrentBag集合的结果是正确的。下面我们修改代码看看ConcurrentBag里面的数据到底是怎么存放的,修改代码如下:
复制代码
public static void ConcurrentBagWithPallel()
{
ConcurrentBag<int> list = new ConcurrentBag<int>();
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());
}
复制代码
先来看一下运行结果:
可以看到,ConcurrentBag中的数据并不是按照顺序排列的,顺序是乱的,随机的。我们平时使用的Max、First、Last等linq方法都还有。其时分类似Enumerable的用法,大家可以参考微软的MSDN了解它的具体用法。
关于线程安全的集合还有很多,和我们平时用的集合都差不多,比如类似Dictionary的ConcurrentDictionary,还有ConcurrentStack,ConcurrentQueue等。
二、Parallel Linq的用法及性能
1、AsParallel
前面了解了并行的For和foreach,今天就来看一下Linq的并行版本是怎么样吧?为了测试,我们添加一个Custom类,代码如下:
public class Custom
{
public string Name { get; set; }
public int Age { get; set; }
public string Address { get; set; }
}
写如下测试代码:
复制代码
public static void TestPLinq()
{
Stopwatch sw = new Stopwatch();
List<Custom> customs = new List<Custom>();
for (int i = 0; i < 2000000; 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<Custom>(c => c.Age > 26).ToList();sw.Stop();Console.WriteLine("Linq time is {0}.",sw.ElapsedMilliseconds);sw.Restart();sw.Start();var result2 = customs.AsParallel().Where<Custom>(c => c.Age > 26).ToList();sw.Stop();Console.WriteLine("Parallel Linq time is {0}.", sw.ElapsedMilliseconds);}
复制代码
其实也就是加了一个AsParallel()方法,下面来看下运行结果:
时间相差了一倍,不过有时候不会相差这么多,要看系统当前的资源利用率。大家可以多测试一下。
其实,AsParallel()这个方法可以应用与任何集合,包括List<T>集合,从而提高查询速度和系统性能。
2、GroupBy方法
在项目中,我们经常要对数据做处理,比如分组统计,我们知道在linq中也可以实现,今天来学习一下新的ToLookup方法,写一个测试方法,代码如下:
复制代码
public static void OrderByTest()
{
Stopwatch stopWatch = new Stopwatch();
List<Custom> customs = new List<Custom>();
for (int i = 0; i < 2000000; 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);}
复制代码
运行结果如下:
ToLookup方法是将集合转换成一个只读集合,所以在大数据量分组时性能优于List.大家可以查阅相关资料,这里由于篇幅问题,不再细说。
转载于:https://blog.51cto.com/13890757/2151164
C#并行和合买平台搭建并行集合和PLinq相关推荐
- 大数据平台搭建及集群规划
CDH大数据平台搭建之集群规划_码上_成功的博客-CSDN博客_cdh集群规划 大数据Hadoop分布式集群部署(详细版)_arnoldmp的博客-CSDN博客_分布式集群部署 大数据平台的硬件规划. ...
- 基于 Win10 平台 搭建 Elasticsearch 集群
基于 Win10 平台搭建 Elasticsearch 集群 1. 基本概念 1.1 单机和集群 1.2 节点 2. 部署集群 3. 启动集群 4. 测试集群 1. 基本概念 1.1 单机和集群 ✨单 ...
- CDH大数据平台搭建之集群规划
CDH大数据平台搭建之集群规划 前言 一.集群规模 二.集群规划 总结 前言 话说无规矩不成方圆,搭建CDH大数据平台之前需要的工作很多,首先,你需要计算公司每日的数据量,来确定需要多少服务器,确定好 ...
- CDH大数据平台搭建之SPARK集群搭建
CDH大数据平台搭建之SPARK集群搭建 一.安装规划 二.下载 三.安装及配置 1.解压 2.修改配置文件 四.启动 五.JPS检查节点 一.安装规划 参考CHD大数据平台搭建之集群规划 二.下载 ...
- CDH大数据平台搭建之KAFKA集群搭建
CDH大数据平台搭建之KAFKA集群搭建 一.安装规划 二.下载KAFKA 三.安装及配置 1.先安装zookeeper 2.解压 3.新建文件夹 4.修改config目录server.propert ...
- 大数据平台搭建 | Hive
前言 大数据平台搭建 | Hadoop 集群搭建(一) 1. 简介 基于Hive3.1.2版本 Hive下载地址 Hive的运行依赖与Hadoop3.X -依赖JDK 1.8环境 2.架构 本质就是存 ...
- RocketMQ 实战 集群监控平台搭建
RocketMQ 实战 集群监控平台搭建 概述 RocketMQ有一个对其扩展的开源项目incubator-rocketmq-externals,这个项目中有一个子模块叫rocketmq-consol ...
- 运维企业专题(2)HTTP加速器——Varnish缓存机制后篇(后端服务器集群、负载均衡与CDN推送平台搭建)
1.实验一:配置后端服务器集群 1)实验目的:定义不同域名站点的后端服务器,通过域名会访问不同的后端主机 2)实验过程: <1>在调度器server1上编写Varnish的配置文件 vim ...
- rocketmq-console集群监控平台搭建
集群监控平台搭建 概述 RocketMQ有一个对其扩展的开源项目incubator-rocketmq-externals,这个项目中有一个子模块叫rocketmq-console,这个便是管理控制台项 ...
最新文章
- 小程序在wxml里转数字_2020年利用名片小程序开启数字化营销的方法
- 福利直播 | 12年阿里巴巴大数据之路亲历者详解数据中台
- 在AI Studio上部署外部可以直接调用的云端服务
- 机器学习-Andrew Ng课程笔记
- 服务发现 注册中心 consul 的介绍、部署和使用
- linux的nohup命令的用法。
- 大内存 php 干什么好 centos,解决CentOS7中php-fpm进程数过多导致服务器内存资源消耗较大的问题...
- Python内置函数eval()用法及其安全问题
- Linux 命令整理-tailf
- 实现JPA的懒加载和无外键
- uniapp实现IM即时通讯仿微信聊天功能
- [机器学习] SSE,MSE,RMSE,R-square指标讲解
- 任务调度+资源调度整合(学习笔记)
- snipaste——一个好用的截图工具
- 答一位网友《SBO有哪样的几种开发方式》
- 细粒度图像分类论文研读-2011
- 超级好用的阿里巴巴字体图标库,附教程
- RFID图书馆和传统图书馆的区别
- Momentum and NAG
- SA(需求分析师)笔试题目整理
热门文章
- microsoft微软登录新账户/切换账户失败,一直转圈,提示“你似乎没有连接到internet”
- ISO 13400 DoIP车载以太网标准各Part部分修订和发布状态汇总(Road vehicles-Diagnostic communication over Internet Protocol)
- BOX2d 系列:绘制曲线
- 20个博客SEO优化技巧
- 【台州网络公司】浅谈网站为什么要优化?
- 基于野狗优化算法的函数寻优算法
- 4款好用的PC端电子书阅读软件,千万别错过
- css3实现三级树形,css3树形导航
- 关于 python3 中的多线程的问题及理解
- Flash--基础认识