前言最近比较闲(项目要转Java,分配到架构组) ,边缘化的人,没事干哈哈哈)前段时间记录一下.NET框架下使用并行策略进行优化的方法之一就是充分利用多核CPU。原因是项目中有一种结算方式,需要汇总内存中一个月的数据进行计算、统计、分组,然后生成新的数据。
在某客户部署后发现该方法执行效率很低。监控发现,从数据库查询数据的速度非常快(因为数据库是独立的服务器)。
然后通过top查看服务器的CPU,达到了%。内存正常,检查了一下CPU型号emm...烂了,不过好在核心多(毕竟是服务器级别的U)...查了服务器核心数,是16。
如果在Linux上用top命令查看,理论上CPU必须达到%才算被消耗。满了,但是程序只吃一个核心。
相当于1个人工作,15个人吃瓜...如图: 然后我查了代码,发现结算计算代码是在单个foreach中顺序计算的,所以我决定使用并行任务库( TPL)由.NET提供来优化。优化完成后,之前的解决直接导致线程超时异常,20秒左右完成。
已经取得了巨大的进步。正文1.NET并行编程简介 如今,随着硬件的飞速发展,太多的个人电脑和服务器级CPU都拥有多个CPU核心,以方便同时执行多个线程。
充分利用硬件,您可以使用并行编程来并行化代码,从而将工作分散到多个处理器上。过去,并行化需要启动子线程、维护锁等各种繁琐的操作。
但从 .NET Framework 4 引入的 TPL 简化了并行开发。通过简单的修改,我们可以编写高效、精细且可扩展的并行代码,而无需直接处理线程或线程池。
下图是官方文档的截图,简单解释了.NET中的并行编程架构: 我们可以看到Parallel在线程处理上增加了一层封装算法,让我们更容易处理并行多线程2。任务并行库 (TPL) 任务并行库 (TPL) 是 System.Threading 和 System.Threading.Tasks 空间中的一组公共类型和 API。
TPL 的目的是通过简化向应用程序添加并行性和并发性的过程来提高开发人员的工作效率。 TPL 动态扩展并发程度,以最有效地利用所有可用处理器。
此外,TPL 还处理工作分区、ThreadPool 上的线程调度、取消支持、状态管理和其他低级细节。通过使用 TPL,您可以最大限度地提高代码的性能,同时专注于程序想要完成的任务。
(上面来自官方文档,我想已经解释的很详细了)接下来我们写一个并行任务的例子来看看效果:首先,并行任务库提供了两个方法:Parallel.ForEach 和 Parallel 。对于用法是类似的。
这里我们使用Parallel.For来做实验。首先创建两个方法。
代码如下: 代码语言:javascript copy //创建顺序执行方法 static List AddModelSequential(int modelCount) { var list = new List (); //为了增加循环复杂度,内部嵌套了一个循环 for (int i = 0; i < modelCount; i++) { int f = 0; for (int j = 0; j < ; j++) { f++; } list.Add(new { bbb = i, aaa = "1", ccc = f });返回列表; } //创建并行执行方法 static List AddModelParallel(int modelCount) { var list = new List(); Parallel.For(0, modelCount, i => { int f = 0; //为了增加循环复杂度,进行一次循环 for (int j = 0; j < ; j++ ) { f++; } list.Add(new { bbb = i, aaa = "1",ccc= f}) });返回列表;然后执行这两个方法,都运行10万条数据,记录执行时间。如下: 代码语言:javascript copy staticvoid Main(string[] args) { Console.Error.WriteLine("执行顺序循环...");秒表 秒表 = new Stopwatch();秒表.Start();添加模型顺序();秒表.Stop(); Console .Error.WriteLine("顺序循环时间(毫秒):{0}", stopwatch.ElapsedMilliseconds);秒表.Reset(); Console.Error.WriteLine("执行并行循环...");秒表.Start() ; var paradata= AddModelParallel();秒表.Stop(); Console.Error.WriteLine("并行循环时间(毫秒):{0}", stopwatch.ElapsedMilliseconds); Console.ReadLine(); } 我是一个I9第12代,有20个CPU逻辑处理器,结果如图:性能提升20倍。
由于开发机上跑的东西比较多,对CPU使用率的监控不是很清楚,所以我们拿出...阿里云99元套餐来看看在2核2G服务器上的效果。我们可以清楚地看到,2核机器上的性能提高了近一倍。
通过top命令,我们可以清晰地监控第一个周期的CPU使用情况。 When, CPU %, single core is full,如图: 当运行第二个循环时,第二个CPU开始参与,如图: 所以在正确的情况下(注意这是一个合适的情况)使用程序中的并行任务库可以充分利用服务器的多核性能,可以大大提高运行效率。
3. 并行PLINQ PLINQ 是LINQ 的一组扩展,它允许在运行代码的计算机上使用多个处理器或核心对。 IEnumerable 接口的集合联合行执行查询这可以显着减少处理大型数据集或执行复杂计算所需的时间。
注意,这里可以看到PLINQ只支持IEnumerable接口,所以不支持linq to sql时的表达式树,如果使用的话会导致全表查询都存放在内存中。使用方法也非常简单。
只需在数据集处理之前添加 AsParallel 方法即可,如下: 代码语言:javascript copy //LINQvar results = from item in dataSource where item.SomeCondition() select item 。 SomeTransformation();//PLINQvar parallelResults = from item in dataSource.AsParallel() where item.SomeCondition() select item.SomeTransformation(); PLINQ的使用场景比较特殊。
我还没有在演示中反映出它比 LINQ 更快。 (甚至 LINQ 也比 PLINQ 快得多)。
所以我们在使用它的时候必须考虑以下几点: 它并不总是更快:虽然PLINQ可以说提高了一些复杂查询的性能,但并不是所有的操作都会有明显的好处。线程管理和同步造成的开销有时会使 PLINQ 查询比顺序查询慢,特别是对于小数据集或计算复杂度较低的操作。
开销:并行化会带来开销,例如任务调度和线程之间的切换。对于小型集合或不占用 CPU 资源的操作,这些开销可能会抵消并行化的好处,从而使 PLINQ 查询比标准 LINQ 查询慢。
排序:默认情况下,PLINQ 不保证结果的顺序。如果排序很重要,您可以使用 AsOrdered 或 OrderBy 方法,但这可能会进一步降低并行化带来的性能提升。
综上所述,如果要使用PLINQ,必须充分进行测试和性能评估。在使用之前,您必须确保 PLINQ 有显着的改进。
站长声明
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件
举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
相关文章
-
近日,工信部发布《年上半年通信业经济运行情况》。 其中通报了我国通信能力的情况。 截至6月底,手机基站总数达到1万个,比上年末净增17万个。 其中,4G基站总数为1万个,占比61.6%; 5G基站总数96.1万个,其中1-6月新建19万个。
06-18
-
万圣节即将到来,没有比读几个恐怖故事、看几部恐怖漫画更好的庆祝方式了。 知名恐怖漫画家弗拉基米尔伊藤润二将与 Netflix 联手推出动画剧集《伊藤润二 狂选集》。 该动画系列包括多达20部作品,将于2020年1月19日首播。 今年的恐怖悬疑系列《聪明镇》已开机拍摄,由梁咏琪和
06-21
-
9月10日消息,近日,研发新一代“微流一体机”的初创公司Day6 Biotech “一一”科技宣布完成数千万元A轮融资,由嵩泽资本领投,老股东、清介资本跟投。 本轮募集资金将用于碧观研发的“现场检查、低成本耗材、一步操作”的分子POCT产品的临床试验和NMPA注册,以及拓展公司的研
06-17
-
据投资界5月13日消息,据36氪报道,专门服务美业门店的美云已完成近千万元天使轮融资< titlesplit >近期完成近千万元天使轮融资。 ,本轮投资方为暴龙资本。 据悉,本轮募集资金将用于拓展市场。 美云成立于2016年3月,以友庄实业上海代理商起家,并取得友庄实业全国代理销售
06-18
-
数百万元天使投资投资界(微信ID:pedaily)4月15日报道称,手游开发商王牌互娱获得快手、途游游戏、北京博弈投资乐视科技、上海灿麦科技(DotC United Group旗下公司)等共同投资的数百万元天使轮融资。 资料显示,王牌互娱是一家手机游戏开发商,前身为北京泛A网络技术有限
06-18
-
Keerati Tanakitjaroenpat 从童年起就是一名狂热的游戏玩家。 他对手机游戏的热情促使他在 2017 年攻读计算机科学学士学位,这使他具备了开发 PC 和手机游戏的技能。 但直到很晚,Tanakitjaroenpat 才开始有动力从头开始创建自己的游戏。 他的大学朋友意识到,在全职工作几年
06-18
-
据投资界8月7日消息,分蛋金服今日宣布完成1万元Pre-A轮融资融资,海泰戈壁为投资人。 据悉,本轮融资资金将用于全国营销推广、企业品牌建设以及科技领域升级。 分蛋金融服务集团成立于2018年7月,是一家围绕婚礼、婆婆服务等家庭消费场景提供金融中介服务的科技金融企业
06-18
-
投资界(ID:pedaily)11月23日消息,北京,国内唯一一家具有侵入性的脑机接口平台公司技术能力 宁聚科技有限公司(NeuraMatrix)完成1亿元人民币A轮融资。 领投方为华盖资本。 沙特阿美旗下多元化风险投资基金Prosperity7 Ventures(P7)以及老股东经纬中国也参与了投资。 光
06-17
-
随着台北电脑展即将开幕,华硕率先发布了ZenFone 3手机系列,这也是华硕在手机市场的旗舰产品今年。 它们是 ZenFone 3、ZenFone 3 Deluxe 和 ZenFone 3 Ultra。 这三款ZenFone手机定位很明显。 美元ZenFone 3的整体配置中规中矩,适合大众用户。 虽然美元的ZenFone 3 Deluxe比
06-17
-
【创业24小时】2022年2月10日投融资昨天国内市场共发生18起投资披露事件,其中先进制造4起(华谊微电子、江苏三杰、恩利动力动力、天兵科技),企业服务案例4起(小岛科技、蓝象智能、亚信安全、晨晶科技)、智能硬件案例3个(灵犀机器人、天翼锂业、铼智能)、金融案例2个(
06-17
-
昨天,小程序正式上线,互联网迎来一场狂欢。 张小龙上个月在公开演讲中表示,“小程序是一种比所有现有应用程序更灵活、更容易访问的形式,并将无处不在。 ”作为微信的一种新形态,小程序不仅拓展了微信的生态系统,也被视为移动互联网的一次“革命”。 任何文本分析都不如
06-17
-
据投资界(ID:pedaily)4月14日消息,近日,“论文写作智能辅助平台文昌”(简称: “文昌”)完成首轮战略投资。 。 据悉,该公司的学术教育平台聚集了包括高校教师、博士、硕士在内的一万名高学历人才。 经过多年在学术领域的积累,形成了以学术志向为核心的学术自媒体矩
06-17
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用