博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
大叔也说并行和串行`性能提升N倍(N由操作系统位数和cpu核数决定)
阅读量:6983 次
发布时间:2019-06-27

本文共 2094 字,大约阅读时间需要 6 分钟。

并行是.net4.5主打的技术,同时被封装到了System.Threading.Tasks命名空间下,对外提供了静态类Parallel,我们可以直接使用它的静态方法,它可以并行一个委托数组,或者一个IEnumerable的迭代,而今天主要通过一个访问数据库的代码,来说说并发Parallel对整个程序的提升是那么大,我们主要从数据库连接数和程序运行时间上就可以很清晰的看到效果。

简单的测试代码

[TestMethod]        public void Read()        {            Stopwatch sw = new Stopwatch();            sw.Start();            var actions = new List
(); for (int i = 0; i < 1000; i++) { actions.Add(() => { using (var db = new am20160316Entities()) { var repository = new Lind.DDD.Repositories.EF.EFRepository
(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
(db); var list = repository.GetModel().ToList(); } } sw.Stop(); Console.WriteLine(sw.ElapsedMilliseconds); }

与数据库建立单个连接

程序运行的时间

通过上面的截图我们可以看到,串行比并行慢了足足1000多毫秒,这个数值会随着并发量的提升而升高。

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

感谢各位的阅读!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:,如需转载请自行联系原博主。

你可能感兴趣的文章
Nginx深入了解-进阶(二)
查看>>
脚本模式创建测试用例 - Katalon Studio
查看>>
SpringCloud核心教程 | 第二篇: 使用Intellij中的maven来快速构建Spring Cloud工程
查看>>
opencv python 模板匹配
查看>>
【前端数据结构基础】集合
查看>>
响应式布局设计
查看>>
node中 模块导入和导出的探究
查看>>
spring mvc如何计算BEST_MATCHING_PATTERN_ATTRIBUTE
查看>>
jQuery源码 - extend 继承&拷贝 解析
查看>>
Spark on Angel:Spark机器学习的核心加速器
查看>>
Facebook开源ptr:在Python环境中并行运行单元测试
查看>>
Redis高可用之主从复制实践(四)
查看>>
SpringBoot 手写拦截器
查看>>
为什么我们做分布式使用Redis?
查看>>
py 决策树①
查看>>
帮您找到正确的提问渠道
查看>>
JavaScript—ES6关于Promise的用法(19)
查看>>
Google发布机器学习平台Tensorflow游乐场~带你玩神经网络(转载)
查看>>
centos6.0下安装FTP客户端命令
查看>>
SAN存储方式之falconstor实施方案(2)
查看>>