大叔也说并行和串行`性能提升N倍(N由操作系统位数和cpu核数决定)

news/2024/7/5 19:51:38

并行是.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多毫秒,这个数值会随着并发量的提升而升高。

所以,在多核时代,在操作系统处理位数高的时代,我们应该尽量多用并行!

感谢各位的阅读!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:大叔也说并行和串行`性能提升N倍(N由操作系统位数和cpu核数决定),如需转载请自行联系原博主。


http://lihuaxi.xjx100.cn/news/248456.html

相关文章

hdu1305Immediate Decodability(字典树)

这题看是否 这题能A是侥幸&#xff0c;解决的办法是先存一下输入的字符串&#xff0c;进行排序。 Problem DescriptionAn encoding of a set of symbols is said to be immediately decodable if no code for one symbol is the prefix of a code for another symbol. We will …

介绍ABC 蜂群算法网站

来源连接&#xff1a; Artificial Bee Colony (ABC) Algorithm Homepage https://abc.erciyes.edu.tr/software.htm 网站主页如下&#xff1a;通过访问可以获得源代码以及相关的说明 可以通过连接获得代码以及文档&#xff0c;自己觉的很全面

Python进度条

1. 简介 在日常运行程序的过程中常常涉及到循环迭代过程&#xff0c;对于执行时间很短的程序来说倒无所谓&#xff0c;但对于运行过程有明显耗时的涉及循环迭代的程序&#xff0c;为其加上进度条&#xff08;progress bar&#xff09;&#xff0c;是帮助我们监测代码执行进度以…

html标签的显示模式(块级标签,行内标签,行内块标签)(转)

html标签的显示模式&#xff08;块级标签&#xff0c;行内标签&#xff0c;行内块标签&#xff09; 今天讲课的时候&#xff0c;讲到了html中的标签的显示模式&#xff0c;大致分为块级标签和行内标签。那么初学者在刚使用标签的时候会发现有些属性在一些标签上不起作用&#x…

Web Api单元测试写法

例如我们在Web Api项目中有个Controller public class SomeController : ApiController { public HttpResponseMessage Get() { // 一些操作 return Request.CreateResponse(HttpStatusCode.OK&#xff0c; someModel); } }如果你在单元测试中直接调用 SomeController 的Get()方…

Android:ViewPager为页卡内视图组件添加事件

在数据适配器PagerAdapter的初始化方法中添加按钮事件&#xff0c;这里是关键&#xff0c;首先判断当前的页卡编号。必须使用当前的view来获取按钮。 Overridepublic Object instantiateItem(View arg0, int arg1) {if (arg1 < 3) {((ViewPager) arg0).addView(mListViews.g…

单目标优化,多目标优化,数值优化,组合优化

何为优化&#xff1f;措施&#xff1a; 对应方法 变得更优&#xff1a; 对应的结果更加的好 优化&#xff1a; 动词&#xff0c;一种行为方法----------->目的是获得更好的结果&#xff0c;总之有所改善 优化问题的三要素&#xff1a; &#xff08;1) 决策变量 所变&…

Eigen使用笔记

1. 常用头文件 2. 使用问题汇总 2.1. 求逆 在有的环境下&#xff0c;有的版本的Eigen&#xff0c;使用Eigen的inverse()求逆&#xff0c;和正确值差一个负号&#xff0c;这是Eigen中存在的bug&#xff0c;修改为矩阵分解后该问题就能解决 Eigen::Matrix4d I Eigen::Matrix4…