中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

大叔也說并行和(he)串行`性能提(ti)升N倍(N由操作系(xi)統位數和(he)cpu核數決(jue)定(ding))

返回目錄

并(bing)行是(shi).net4.5主打的技(ji)術,同(tong)時被封(feng)裝到了System.Threading.Tasks命名空間(jian)下,對外提供(gong)了靜(jing)(jing)態(tai)類Parallel,我們可(ke)以直接(jie)使用它(ta)的靜(jing)(jing)態(tai)方法,它(ta)可(ke)以并(bing)行一(yi)(yi)個委托數(shu)(shu)組,或者一(yi)(yi)個IEnumerable的迭代(dai),而今天主要(yao)(yao)通過(guo)一(yi)(yi)個訪問(wen)數(shu)(shu)據庫的代(dai)碼,來說(shuo)說(shuo)并(bing)發(fa)Parallel對整個程(cheng)序的提升是(shi)那么(me)大,我們主要(yao)(yao)從數(shu)(shu)據庫連(lian)接(jie)數(shu)(shu)和程(cheng)序運行時間(jian)上就可(ke)以很清晰的看到效果。

簡單的測(ce)試代碼

       [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);
        }

上面代碼為并行執行[可用的線程數據并行](并不是(shi)說1000個任(ren)務,就(jiu)必須開1000個線(xian)(xian)程去干這(zhe)事,由于.net自己也線(xian)(xian)程池(chi)的概念,所(suo)有它會根據(ju)系(xi)統使用情況去為我們這(zhe)個進程分(fen)配(pei),如果(guo)你(ni)的各方面(mian)請求需要(yao).net分(fen)配(pei)更(geng)多的線(xian)(xian)程,那就(jiu)才會現時(shi)有多個線(xian)(xian)程啟動(dong)(如果(guo)是(shi)連接(jie)數據(ju)庫,它和(he)你(ni)數據(ju)連接(jie)串的MaxPoolSize和(he)MinPoolSize都是(shi)關(guan)系(xi)的)。

程序與服(fu)務器之前的連接

程(cheng)序(xu)與數據(ju)庫進行(xing)通訊(xun)時(shi)(shi),同時(shi)(shi)開了一(yi)些(xie)連接(jie),我們可以通過(guo)netstat -nba | findstr 192.168.2.123指(zhi)令來查(cha)看與指(zhi)定服務器(qi)通訊(xun)的(de)情(qing)況,當(dang)我們修改MinPooSize的(de)時(shi)(shi)候,會(hui)影響這個(ge)程(cheng)序(xu)與數據(ju)庫建立(li)通訊(xun)的(de)次數,當(dang)然同時(shi)(shi)建立(li)通訊(xun)次數越(yue)多,性能越(yue)好,當(dang)然這也(ye)要(yao)看數據(ju)庫服務器(qi)的(de)能力了,呵呵。

事(shi)實上,如果(guo)我們(men)的(de)(de)(de)程(cheng)序是(shi)單線程(cheng)串(chuan)行執行的(de)(de)(de),上面這個(ge)圖只(zhi)要顯示(shi)一(yi)個(ge)活動的(de)(de)(de)連接,性(xing)能與同時10幾個(ge)連接,那肯(ken)定(ding)是(shi)沒法比的(de)(de)(de),這個(ge)很容易(yi)理解,就(jiu)像(xiang)先10萬的(de)(de)(de)人過橋(qiao)(qiao)一(yi)下,大橋(qiao)(qiao)和獨木橋(qiao)(qiao)來說,10萬人通過的(de)(de)(de)話,時間一(yi)定(ding)是(shi)不(bu)一(yi)樣的(de)(de)(de),呵呵。

上面(mian)是并行處(chu)理(li)1000次(ci)連接的(de)時(shi)間,3427毫秒,而對(dui)于單線程串行來(lai)說,我們看(kan)一下它的(de)處(chu)理(li)時(shi)間

代碼

       [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);
        }

與(yu)數(shu)據(ju)庫(ku)建立單個(ge)連接

程序運行的時間

通過上面的截圖我們可以看(kan)到,串行(xing)比并行(xing)慢了足(zu)足(zu)1000多毫秒,這個數(shu)值會隨著并發(fa)量的提升而升高。

所以(yi),在多核(he)時代,在操作系統處理位數高的時代,我們應該盡量多用并(bing)行!

感謝各位的閱讀!

返回目錄

posted @ 2016-10-28 09:57  張占嶺  閱讀(2955)  評論(9)    收藏  舉報