大叔也说并行和串行`性能提升N倍(N由操作系统位数和cpu核数决定)
并行是.net4.5主打的技术,同时被封装到了System.Threading.Tasks命名空间下,对外提供了静态类Parallel,我们可以直接使用它的静态方法,它可以并行一个委托数组,或者一个IEnumerable的迭代,而今天主要通过一个访问数据库的代码,来说说并发Parallel对整个程序的提升是那么大,我们主要从数据库连接数和程序运行时间上就可以很清晰的看到效果。
简单的测试代码
[TestMethod] public void Read() { Stopwatch sw = new Stopwatch(); sw.Start(); var actions = new List<Action>(); for (int i = 0; i < 1000; i++) { actions.Add(() => { using (var db = new am20160316Entities()) { var repository = new Lind.DDD.Repositories.EF.EFRepository<ad_contract>(db); var list = repository.GetModel().ToList(); } }); } Parallel.Invoke(actions.ToArray()); sw.Stop(); Console.WriteLine(sw.ElapsedMilliseconds); }
上面代码为并行执行[可用的线程数据并行](并不是说1000个任务,就必须开1000个线程去干这事,由于.net自己也线程池的概念,所有它会根据系统使用情况去为我们这个进程分配,如果你的各方面请求需要.net分配更多的线程,那就才会现时有多个线程启动(如果是连接数据库,它和你数据连接串的MaxPoolSize和MinPoolSize都是关系的)。
程序与服务器之前的连接
程序与数据库进行通讯时,同时开了一些连接,我们可以通过netstat -nba | findstr 192.168.2.123指令来查看与指定服务器通讯的情况,当我们修改MinPooSize的时候,会影响这个程序与数据库建立通讯的次数,当然同时建立通讯次数越多,性能越好,当然这也要看数据库服务器的能力了,呵呵。
事实上,如果我们的程序是单线程串行执行的,上面这个图只要显示一个活动的连接,性能与同时10几个连接,那肯定是没法比的,这个很容易理解,就像先10万的人过桥一下,大桥和独木桥来说,10万人通过的话,时间一定是不一样的,呵呵。
上面是并行处理1000次连接的时间,3427毫秒,而对于单线程串行来说,我们看一下它的处理时间
代码
[TestMethod] public void SignalRead() { Stopwatch sw = new Stopwatch(); sw.Start(); for (int i = 0; i < 1000; i++) { using (var db = new am20160316Entities()) { var repository = new Lind.DDD.Repositories.EF.EFRepository<ad_contract>(db); var list = repository.GetModel().ToList(); } } sw.Stop(); Console.WriteLine(sw.ElapsedMilliseconds); }
与数据库建立单个连接
程序运行的时间
通过上面的截图我们可以看到,串行比并行慢了足足1000多毫秒,这个数值会随着并发量的提升而升高。
所以,在多核时代,在操作系统处理位数高的时代,我们应该尽量多用并行!
感谢各位的阅读!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2014-10-28 Nginx系列~负载均衡服务器与WWW服务器的实现
2014-10-28 Nginx系列~Nginx服务启动不了
2013-10-28 EF架构~为IEnumerable接口添加增删查等操作,原因是IEnumerable导航属性更放心
2013-10-28 EF架构~关系表插入应该写在事务里,但不应该是分布式事务
2011-10-28 MVC中ASCX分部视图的Action在哪里设置
2011-10-28 MVC LINQ中用封装的TSQL通用更新方法