返回目錄
並行是.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多毫秒,這個數值會隨著並發量的提升而升高。
所以,在多核時代,在操作系統處理位數高的時代,我們應該盡量多用並行!
感謝各位的閱讀!
返回目錄