网易首页 > 网易号 > 正文 申请入驻

共享内存 & Actor并发模型哪个更快?

0
分享至

HI,前几天被.NET圈纪检委@懒得勤快问到共享内存和Actor并发模型哪个速度更快。

image

前文传送门:

说实在,我内心10w头羊驼跑过......

先说结论

  1. 首先两者对于并发的风格模型不一样。

共享内存利用多核CPU的优势,使用强一致的锁机制控制并发, 各种锁交织,稍不注意可能出现死锁,更适合熟手。

Actor模型易于控制和管理,以消息触发,流水线挨个处理, 思路清晰。

  1. 真要说性能,求100000 以内的素数的个数]场景 & 我电脑8c 16g的配置, 我根据这个示例拍脑袋对比。。。。。
  • 2.1 理论上如果以默认的Actor并发模型来做这个事情,Actor的性能是逊于共享内存模型的;
  • 2.2 上文中我对于Actor做了多线程优化,性能慢慢追上来了。
默认Actor模型

计算[100_000内素数的个数], 分为两步:
(1) 迭代判断当前数字是不是素数
(2) 如果是素数,执行sum++

共享内存完成以上两步, 均能充分利用CPU多核心。

Actor模型:与TPL中的原文不同,TPL datflow中的所有块默认是单线程的,这就意味着完成以上两步的TransfromBlock和ActionBlock都是以一个线程挨个处理消息数据(这也是Dataflow的设计初衷,形成清晰单纯的流水线)。

猜测起来也是共享内存相比默认的Actor模型更具优势。

使用NUnit做单元测试,数据量从小到大: 10_000,50_000,100_000,200_000,300_000,500_000

using NUnit.Framework; using System; using System.Threading.Tasks; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks.Dataflow; namespace TestProject2 { public class Tests { [TestCase(10_000)] [TestCase(50_000)] [TestCase(100_000)] [TestCase(200_000)] [TestCase(300_000)] [TestCase(500_000)] public void ShareMemory(int num) { var sum = 0; Parallel.For(1, num + 1, (x, state) => { var f = true; if (x == 1) f = false; for (int i = 2; i <= x / 2; i++) { if (x % i == 0) // 被[2,x/2]任一数字整除,就不是质数 f = false; } if (f == true) { Interlocked.Increment(ref sum);// 共享了sum对象,“++”就是调用sum对象的成员方法 } }); Console.WriteLine($"1-{num}内质数的个数是{sum}"); } [TestCase(10_000)] [TestCase(50_000)] [TestCase(100_000)] [TestCase(200_000)] [TestCase(300_000)] [TestCase(500_000)] public async Task Actor(int num) { var linkOptions = new DataflowLinkOptions { PropagateCompletion = true }; var bufferBlock = new BufferBlock(); var transfromBlock = new TransformBlock(x => { var f = true; if (x == 1) f = false; for (int i = 2; i <= x / 2; i++) { if (x % i == 0) // 被[2,x/2]任一数字整除,就不是质数 f = false; } return f; }, new ExecutionDataflowBlockOptions { EnsureOrdered = false }); var sum = 0; var actionBlock = new ActionBlock(x => { if (x == true) sum++; }, new ExecutionDataflowBlockOptions { EnsureOrdered = false }); transfromBlock.LinkTo(actionBlock, linkOptions); // 准备从pipeline头部开始投递 try { var list = new List { }; for (int i = 1; i <= num; i++) { var b = await transfromBlock.SendAsync(i); if (b == false) { list.Add(i); } } if (list.Count > 0) { Console.WriteLine($"md,num post failure,num:{list.Count},post again"); // 再投一次 foreach (var item in list) { transfromBlock.Post(item); } } transfromBlock.Complete(); // 通知头部,不再投递了; 会将信息传递到下游。 actionBlock.Completion.Wait(); // 等待尾部执行完 Console.WriteLine($"1-{num} Prime number include {sum}"); } catch (Exception ex) { Console.WriteLine($"1-{num} cause exception.",ex); } } } }

测试结果如下:

image

测试结果印证我说的结论2.1

优化后的Actor模型

那后面我对Actor做了什么优化呢?能产生下图的结论。

image

请重新回看《三分钟掌握》 TransformBlock块的细节:

var transfromBlock = new TransformBlock(x => { var f = true; if (x == 1) f = false; for (int i = 2; i <= x / 2; i++) { if (x % i == 0) // 被[2,x/2]任一数字整除,就不是质数 f = false; } return f; }, new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism=50, EnsureOrdered = false });

上面说到默认的Actor是单线程处理输入的消息, 此时我们设置了MaxDegreeOfParallelism参数,参数能在Actor中开启多线程并发执行,但是这里面就不能有共享变量(否则你又得加锁),恰好我们完成 (1) 迭代判断当前数字是不是素数这一步并不依赖共享对象,所以这一步性能与共享内存模型基本没差别。

那为什么总体性能慢慢超过共享内存?

这是因为执行第二步(2) 如果是素数,执行sum++, 共享内存要加解锁,线程上下文切换,而Actor单线程挨个处理, 总体就略胜共享内存模型了。

这里再次强调,Actor模型执行第二步(2) 如果是素数,执行sum++,不可开启MaxDegreeOfParallelism,因为依赖了共享变量sum

image

结束语

请大家仔细对比结论和上图,脱离场景和硬件环境谈性能就是耍流氓,理解不同并发模型的风格和能力是关键,本文仅针对这个示例拍脑袋对比。

实际要针对场景和未来的拓展性、可维护性、可操作性做技术选型 。

That's All, 感谢.NET圈纪检委@懒得勤快促使我重温了单元测试的写法 & 深度分析Actor模型。

推荐阅读更多精彩内容

  • 三分钟掌握共享内存 & Actor并发模型

    共享内存 面向对象编程中,万物都是对象,数据+行为=对象;多核时代,可并行多个线程,但是受限于资源对象,线程之间存...

    Java_老男孩 阅读 58 评论 0 赞 0

  • Actor并发编程模型浅析

    一.Actor模型介绍 在单核 CPU 发展已经达到一个瓶颈的今天,要增加硬件的速度更多的是增加 CPU 核的数目...

    大数据_zzzzMing 阅读 320 评论 0 赞 1

  • 并发编程基础知识四 Actor CSP protoactor-go

    参考码农翻身 当多线程并发遇到Actor goroutine, channel 和 CSP并发之痛 Thread,...

    合肥黑 阅读 1,342 评论 0 赞 5

  • Actor模型

    传统的游戏服务器要么是单线程要么是多线程,过去几十年里CPU一直遵循摩尔定律发展,带来的结果是单核频率越来越高。而...

    JunChow520 阅读 41,675 评论 12 赞 45

  • C/C++并发编程(1)—— 并发/并行、多线程内存模型

    最近看了《七周七并发模型》[1],对自己熟悉的C/C++并发编程有了很多新的思考。在Google上搜索“C C++...

    Eason_Ye 阅读 9,426 评论 0 赞 4

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
完了,完了!美国刚刚宣布了!

完了,完了!美国刚刚宣布了!

星辰故事屋
2024-11-16 18:28:40
压倒穷人的永远是钱,房租涨价,上海男子挥刀致使一死二伤

压倒穷人的永远是钱,房租涨价,上海男子挥刀致使一死二伤

云端小院
2024-11-16 08:53:17
土耳其全国疯狂欢呼!美国气得暴跳如雷,歼-35A亮相引发全球关注

土耳其全国疯狂欢呼!美国气得暴跳如雷,歼-35A亮相引发全球关注

时时有聊
2024-11-12 09:17:22
小米在广州车展上免费发水!结果网上矿泉水被人转卖79元/瓶!

小米在广州车展上免费发水!结果网上矿泉水被人转卖79元/瓶!

王晓爱体彩
2024-11-16 18:05:34
悲哀!云南学校有钱建草堂,没有钱修宿舍,提出质疑的学生遭带走

悲哀!云南学校有钱建草堂,没有钱修宿舍,提出质疑的学生遭带走

小淇言说
2024-11-16 11:46:00
重磅!中国或将恢复对日本的免签政策!网友:日本应拿出更多诚意…

重磅!中国或将恢复对日本的免签政策!网友:日本应拿出更多诚意…

东京新青年
2024-11-16 15:22:14
少林寺方丈释永信联合国气候大会发声:禅宗在气候问题中可发挥积极作用

少林寺方丈释永信联合国气候大会发声:禅宗在气候问题中可发挥积极作用

澎湃新闻
2024-11-15 22:08:28
俄著名军事博主被编入突击队,乌围点打援击溃俄5支救援队

俄著名军事博主被编入突击队,乌围点打援击溃俄5支救援队

史政先锋
2024-11-16 14:25:47
最新!俄罗斯开出停战先决条件

最新!俄罗斯开出停战先决条件

鲁中晨报
2024-11-16 09:44:07
特朗普新一轮任命再掀争论:美卫生部长提名被称“一记重拳”,私人律师可能获高级职位

特朗普新一轮任命再掀争论:美卫生部长提名被称“一记重拳”,私人律师可能获高级职位

环球网资讯
2024-11-16 06:36:13
共线运行的上海地铁3、4号线总是“分不清”?上海市交通委回应

共线运行的上海地铁3、4号线总是“分不清”?上海市交通委回应

澎湃新闻
2024-11-15 16:12:28
闹大了!国税总局原副局长许善达先生:五口之家月收入4000元就够

闹大了!国税总局原副局长许善达先生:五口之家月收入4000元就够

蜉蝣说
2024-11-16 21:09:26
金鸡奖台下全是戏:王一博落败秒变脸,陈凯歌握手跳过刘德华

金鸡奖台下全是戏:王一博落败秒变脸,陈凯歌握手跳过刘德华

光影新天地
2024-11-17 00:23:21
西媒关注27岁国脚:皇马首位中国球员!7400万没卖,0价离开

西媒关注27岁国脚:皇马首位中国球员!7400万没卖,0价离开

叶青足球世界
2024-11-16 21:06:01
圣彼得堡多个市场发生大规模突击搜查中国移民身份

圣彼得堡多个市场发生大规模突击搜查中国移民身份

莫斯科不相信眼泪
2024-11-16 15:07:36
闹大了!重庆69岁老妇人持刀袭警被击毙,内幕曝光令人气愤!

闹大了!重庆69岁老妇人持刀袭警被击毙,内幕曝光令人气愤!

白马惊天剑
2024-11-16 12:22:41
高中生吐槽宿舍后续:已被家长带回家,48万草堂和宿舍照片曝光!

高中生吐槽宿舍后续:已被家长带回家,48万草堂和宿舍照片曝光!

来条娱吃
2024-11-16 23:16:55
60万股东哭晕!常山北明,崩盘了?

60万股东哭晕!常山北明,崩盘了?

看财经show
2024-11-16 15:19:35
国内还没传开,海外已经吵翻了,美媒:比亚迪正在改变游戏规则!

国内还没传开,海外已经吵翻了,美媒:比亚迪正在改变游戏规则!

讲者普拉斯
2024-11-16 22:35:57
固态电池首次上车,纯电续航1500公里

固态电池首次上车,纯电续航1500公里

电动知家
2024-11-16 18:17:37
2024-11-17 03:12:49
java架构学习
java架构学习
java架构经验学习分享
378文章数 7804关注度
往期回顾 全部

科技要闻

杨植麟:每月有3600万用户在使用kimi

头条要闻

江苏高校持刀伤人事件致8死17伤 嫌疑犯被当场抓获

头条要闻

江苏高校持刀伤人事件致8死17伤 嫌疑犯被当场抓获

体育要闻

双手沾满鲜血的童年,塑造了NBA最拼命的球员

娱乐要闻

金鸡奖:赵丽颖未获奖,王骁拿奖

财经要闻

中铁七局致歉!对5人就地免职

汽车要闻

越野拉满 东风猛士917高地雄狮售69.9万元

态度原创

亲子
教育
时尚
手机
房产

亲子要闻

家里有1-8岁宝宝的,早教益智磁力棒可以锻炼手眼协调能力

教育要闻

第五届深圳校园文化节暨大湾区校园文化科创展开幕

时尚女性秋季穿衣从不发愁,试试这27套穿搭,每周穿搭不重复

手机要闻

红米K70至尊版更新澎湃OS2.0.5体验:不吐不快,说说真实感受!

房产要闻

最新房价!海口新房,年内新低!但二手房,开始回暖!

无障碍浏览 进入关怀版