合买平台搭建

并行算法的出现,随之而产生的也就有了并行集合,及线程安全集合;微软向的也算周到,没有忘记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相关推荐

  1. 大数据平台搭建及集群规划

    CDH大数据平台搭建之集群规划_码上_成功的博客-CSDN博客_cdh集群规划 大数据Hadoop分布式集群部署(详细版)_arnoldmp的博客-CSDN博客_分布式集群部署 大数据平台的硬件规划. ...

  2. 基于 Win10 平台 搭建 Elasticsearch 集群

    基于 Win10 平台搭建 Elasticsearch 集群 1. 基本概念 1.1 单机和集群 1.2 节点 2. 部署集群 3. 启动集群 4. 测试集群 1. 基本概念 1.1 单机和集群 ✨单 ...

  3. CDH大数据平台搭建之集群规划

    CDH大数据平台搭建之集群规划 前言 一.集群规模 二.集群规划 总结 前言 话说无规矩不成方圆,搭建CDH大数据平台之前需要的工作很多,首先,你需要计算公司每日的数据量,来确定需要多少服务器,确定好 ...

  4. CDH大数据平台搭建之SPARK集群搭建

    CDH大数据平台搭建之SPARK集群搭建 一.安装规划 二.下载 三.安装及配置 1.解压 2.修改配置文件 四.启动 五.JPS检查节点 一.安装规划 参考CHD大数据平台搭建之集群规划 二.下载 ...

  5. CDH大数据平台搭建之KAFKA集群搭建

    CDH大数据平台搭建之KAFKA集群搭建 一.安装规划 二.下载KAFKA 三.安装及配置 1.先安装zookeeper 2.解压 3.新建文件夹 4.修改config目录server.propert ...

  6. 大数据平台搭建 | Hive

    前言 大数据平台搭建 | Hadoop 集群搭建(一) 1. 简介 基于Hive3.1.2版本 Hive下载地址 Hive的运行依赖与Hadoop3.X -依赖JDK 1.8环境 2.架构 本质就是存 ...

  7. RocketMQ 实战 集群监控平台搭建

    RocketMQ 实战 集群监控平台搭建 概述 RocketMQ有一个对其扩展的开源项目incubator-rocketmq-externals,这个项目中有一个子模块叫rocketmq-consol ...

  8. 运维企业专题(2)HTTP加速器——Varnish缓存机制后篇(后端服务器集群、负载均衡与CDN推送平台搭建)

    1.实验一:配置后端服务器集群 1)实验目的:定义不同域名站点的后端服务器,通过域名会访问不同的后端主机 2)实验过程: <1>在调度器server1上编写Varnish的配置文件 vim ...

  9. rocketmq-console集群监控平台搭建

    集群监控平台搭建 概述 RocketMQ有一个对其扩展的开源项目incubator-rocketmq-externals,这个项目中有一个子模块叫rocketmq-console,这个便是管理控制台项 ...

最新文章

  1. 小程序在wxml里转数字_2020年利用名片小程序开启数字化营销的方法
  2. 福利直播 | 12年阿里巴巴大数据之路亲历者详解数据中台
  3. 在AI Studio上部署外部可以直接调用的云端服务
  4. 机器学习-Andrew Ng课程笔记
  5. 服务发现 注册中心 consul 的介绍、部署和使用
  6. linux的nohup命令的用法。
  7. 大内存 php 干什么好 centos,解决CentOS7中php-fpm进程数过多导致服务器内存资源消耗较大的问题...
  8. Python内置函数eval()用法及其安全问题
  9. Linux 命令整理-tailf
  10. 实现JPA的懒加载和无外键
  11. uniapp实现IM即时通讯仿微信聊天功能
  12. [机器学习] SSE,MSE,RMSE,R-square指标讲解
  13. 任务调度+资源调度整合(学习笔记)
  14. snipaste——一个好用的截图工具
  15. 答一位网友《SBO有哪样的几种开发方式》
  16. 细粒度图像分类论文研读-2011
  17. 超级好用的阿里巴巴字体图标库,附教程
  18. RFID图书馆和传统图书馆的区别
  19. Momentum and NAG
  20. SA(需求分析师)笔试题目整理

热门文章

  1. microsoft微软登录新账户/切换账户失败,一直转圈,提示“你似乎没有连接到internet”
  2. ISO 13400 DoIP车载以太网标准各Part部分修订和发布状态汇总(Road vehicles-Diagnostic communication over Internet Protocol)
  3. BOX2d 系列:绘制曲线
  4. 20个博客SEO优化技巧
  5. 【台州网络公司】浅谈网站为什么要优化?
  6. 基于野狗优化算法的函数寻优算法
  7. 4款好用的PC端电子书阅读软件,千万别错过
  8. css3实现三级树形,css3树形导航
  9. 关于 python3 中的多线程的问题及理解
  10. Flash--基础认识