大叔也说并行和串行`性能提升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多毫秒,这个数值会随着并发量的提升而升高。

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

感谢各位的阅读!

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

目录
相关文章
|
3月前
|
缓存 Linux 调度
操作系统-CPU粘合
操作系统-CPU粘合
24 0
|
3月前
|
存储 缓存 关系型数据库
【如何选择Mysql服务器的CPU核数及内存大小】
【如何选择Mysql服务器的CPU核数及内存大小】
108 0
|
23天前
|
存储 缓存 PHP
阿里云服务器实例、CPU内存、带宽、操作系统选择参考
对于使用阿里云服务器的用户来说,云服务器的选择和使用非常重要,如果实例、内存、CPU、带宽等配置选择错误,可能会影响到自己业务在云服务器上的计算性能及后期运营状况,本文为大家介绍一下阿里云服务器实例、CPU内存、带宽、操作系统的选择注意事项,以供参考。
阿里云服务器实例、CPU内存、带宽、操作系统选择参考
|
1月前
|
算法 网络协议 调度
操作系统 -- CPU调度
操作系统 -- CPU调度
18 0
|
2月前
|
资源调度 调度 UED
CPU执行系统调用时发生中断,操作系统还能切回中断前的系统调用继续执行吗?
系统调用服务例程在执行过程中,通常不会被中断。系统调用服务例程的执行是一个原子操作,即在执行期间不会被中断。这是为了确保在系统调用服务例程执行期间对内核数据结构的一致性和完整性。
|
3月前
|
存储
手写操作系统 - CPU段页门
手写操作系统 - CPU段页门
|
5月前
|
缓存 Ubuntu Linux
如何在 Ubuntu 中检查 CPU 核数?
如何在 Ubuntu 中检查 CPU 核数?
432 0
|
5月前
我的电脑的cpu、cpu核数
我的电脑的cpu、cpu核数
60 0
|
8月前
|
缓存 算法 Java
为什么Netty线程池默认大小为CPU核数的2倍
有位工作5年的小伙伴问我说,为什么Netty线程池默认大小为CPU核数的2倍,今天,我花2分钟时间给大家专门分享一下我对这个问题的理解。
74 0
|
8月前
|
消息中间件 存储 缓存
计算机操作系统学习笔记(3)——CPU缓存一致性
计算机操作系统学习笔记(3)——CPU缓存一致性
153 0