亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C#中實現并發的幾種方法的性能測試

2019-11-14 13:58:42
字體:
來源:轉載
供稿:網友

C#中實現并發的幾種方法的性能測試

0x00 起因

去年寫的一個程序因為需要在局域網發送消息支持一些命令和簡單數據的傳輸,所以寫了一個C/S的通信模塊。當時的做法很簡單,服務端等待鏈接,有用戶接入后開啟一個線程,在線程中運行一個while循環接收數據,接收到數據就處理。用戶退出(收到QUIT命令)后線程結束。程序一直運行正常(當然還要處理“TCP粘包”、消息格式封裝等問題,在此不作討論),不過隨著使用的人越來越多,而且考慮到線程開銷比較大,如果有100個用戶鏈接那么服務端就要多創建100個線程,500個用戶就是500個線程,確實太夸張了(當然實際并沒有那么多用戶)。由于TCP通信并不是每時每刻都在進行著的,因此可以把所有客戶端連接存儲到一個列表中,通過輪詢的方式依次開啟一個線程進行數據接收,接收完畢后釋放線程,這樣可以充分利用線程池,避免大量線程消耗內存和CPU。

輪詢的方式通過線程池實現了線程的復用,可以肯定的是在資源開銷上肯定是小很多的,但輪詢的方式在單位時間內的處理次數會不會比保持線程的方式少很多呢,本測試將解決這個疑問。

0x01 實驗方法

IDE:VS2015

.Net Framework 4.5

接收數據的對象如下所示

 

通過ReceiveData方法接收數據,每次接收只有1%的可能性收到數據,通過創建N個對象接收數據來模擬一個TCP服務端處理N個連接的情況。畢竟TCP通信不是隨時進行的,當然這個百分比可以調整。程序輸出的內容包括每秒執行了多少次接收操作,接收到數據的線程編號和接收到的內容等。

0x02 保持線程的并發

保持線程的并發非常直觀,就是每建立一個對象就開一個新線程循環進行ReceiveData操作,當接收到數據就把相關信息輸出到主界面上。代碼如下所示:

 

0x03 使用ThreadPool輪詢并發

方法是使用一個List(或其他容器)把所有的對象放進去,創建一個線程(為了防止UI假死,由于這個線程創建后會一直執行切運算密集,所以使用TheadPool和Thread差別不大),在這個線程中使用foreach(或for)循環依次對每個對象執行ReceiveData方法,每次執行的時候創建一個線程池線程來執行。代碼如下:

 

0x04使用Task輪詢并發

方法與ThreadPool類似,只是每次創建線程池線程執行ReceiveData方法時是通過Task創建的線程。代碼如下所示:

 

0x05 使用await輪詢并發

方法與ThreadPool類似,只是每次創建線程池線程執行ReceiveData方法時是通過await等待操作。代碼如下:

剛開始在foreach中寫了await導致線程阻塞,但因為ReceiveData()中測試時為了盡量拉開差距沒有讓線程睡眠以模擬線程操作,導致沒有意識到這個問題,多謝 @逸風之狐 提醒。

修改后代碼如下所示,這樣測試方法就可以立即返回了。不過async/await確實不是用來干這個的。

 

0x06 使用Parallel并發

這是FCL提供的一種方法,Parallel.ForEach中每次方法都是異步執行,執行采用的是線程池線程。代碼如下所示:

 

0x07 測試結果

創建500個對象來模擬500個連接的情況。其中測試結果中的每秒接收次數會有個波動范圍,主要參照百位以上。使用線程池線程的幾個方法(ThreadPool、Task、await、Parallel)中程序的線程數略有差別,可能跟執行環境有關,難以表明實質性差異。其中await因為線程切換導致線程執行時間略長,使得線程池需要多創建一些線程。

1、保持線程的并發

 

平均每秒接收8654次數據。在任務開始后會創建500個線程,由于每個線程都需要單獨的??臻g來執行,內存消耗較大。頻繁切換線程也會加重CPU的負擔。

2、ThreadPool輪詢并發

 

平均每秒接受9529次數據。由于實現了線程池線程的復用,無需創建太多線程,內存沒有出現波動,CPU消耗也比較均勻。

3、Task輪詢并發

 

平均每秒接收9322次數據,由于Task也是基于線程池的封裝,因此與ThreadPool結果差別不大。

4、await輪詢并發

 

平均每秒接收4150次。await也是使用線程池線程,所以在內存開銷和線程數上與其他使用線程池線程的方法沒有太大差別。但await在等待完畢后會將執行上下文從線程池線程切換回調用線程,因此CPU開銷較大。

5、Parallel并發

 

看名字就知道這個設計出來就是應用于這種使用環境的,平均每秒接收9387次數據,也是使用線程池線程,所以內存和CPU消耗與ThreadPool和Task差不多。但不需要自己寫foreach(for)循環,只要寫循環體即可。

6、補充測試

經測試隨著ReceiveData()耗時不斷增加,輪詢方式的優勢越來越小。表現就是剛開始線程執行效率很低,需要花費時間慢慢趕上去。因為線程池中的初始線程不夠用,需要創建更多的線程池線程,線程池線程創建起來沒有Thread那么快,不過當線程池中的線程數量逐漸滿足需求之后,輪詢的優勢就又體現出來了。

測試1:測試同樣500個線程,有1%的可能接收到數據,但收到數據時模擬執行操作耗時100毫秒,程序剛開始效率很低,花了大概12秒左右,當線程數增長到54個時基本穩定可以滿足需求,效率也越來越高。

測試2:測試同樣500個線程,有1%的可能接收到數據,但收到數據時模擬執行操作耗時500毫秒,程序剛開始效率同樣很低,花了大概150秒左右,當線程數增長到97個時基本穩定可以滿足需求,效率也越來越高。

0x08 結論

首先明顯能看出來的是使用輪詢的方式比保持線程能節省很多資源,特別是內存。而且在處理效率上輪詢的方式(每秒接收9300-9500次)比保持線程還要高(每秒8600+)。因此在這種并發模型下應該使用輪詢的方式以節省資源并提高并發效率。

實際上硬拿await來比較是不太公平的,await被設計出來就不是應用于這種場景的。不管是之前關于異步的測試還是并發的測試,基于線程池的方案相差都不大。因此思路對了的情況下使用ThreadPool總是沒錯的。但有些類型把ThreadPool包裝了以更好適應某些特殊場景,因此有了Task、await、Parallel等。而在這次的測試條件下顯然Parallel是最合適的,與直接使用ThreadPool相比資源開銷和執行效率一樣,但代碼更少。

在補充測試中也能看到,不同的運行環境對運行效率的影響還是很大的,因此還是要針對自己的環境做針對性更強的測試以采用更合適的方法。例如在我的使用環境中,服務端TCP消息的轉發和部分命令的處理耗時都是非常短的。同樣假設最高同時在線500個用戶,這500個用戶也不會是同事登陸的,所以也不會存在線程池初始線程嚴重不夠用的情況。隨著用戶慢慢登陸,線程池線程根據需求慢慢增加,這樣創建線程池線程增加的耗時就不那么明顯了。所以在我的使用環境下輪詢的方式無疑是合適的。因此剛開始對ReceiveData()只設置了接受數據的概率,沒有模擬延遲。大家有需求的可以把測試程序下下來根據實際情況調整最大并發數、接收到數據的概率和接收數據的耗時以進行測試。

0x09 相關下載

測試代碼下載鏈接:https://github.com/durow/TestArea/tree/master/AsyncTest/ConcurrenceTest


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品电影观看| 欧美电影在线播放| 日韩成人中文电影| 国产啪精品视频| 欧美激情小视频| 久久久久久久久久婷婷| 午夜精品一区二区三区在线播放| 98视频在线噜噜噜国产| 久久久久久高潮国产精品视| 日本在线观看天堂男亚洲| 久久久av免费| 欧美贵妇videos办公室| 国产精品99蜜臀久久不卡二区| 成人动漫网站在线观看| 国产精品第一区| 日韩在线视频播放| 亚洲性无码av在线| 久久色在线播放| 91精品啪在线观看麻豆免费| 九九视频这里只有精品| 久久中文字幕在线| 国产精品久久久久久久9999| 91理论片午午论夜理片久久| 日本亚洲精品在线观看| 欧美网站在线观看| 国产精品影院在线观看| 欧美大尺度激情区在线播放| 日韩美女在线观看| 欧美天堂在线观看| 久久99国产精品久久久久久久久| 亚洲aa中文字幕| 亚洲经典中文字幕| 欧美日韩激情美女| 中文字幕少妇一区二区三区| 国产在线日韩在线| 国产精品久久久久久久久免费| 国产97在线|亚洲| 久久国产精品影视| 91成人天堂久久成人| 国产精品伦子伦免费视频| 欧美日韩在线免费观看| 国产成人精品综合久久久| 日韩中文字幕在线视频| 日本精品一区二区三区在线| 亚洲精品综合久久中文字幕| 欧美人与物videos| 成人午夜在线观看| 中文字幕亚洲综合| 欧美精品日韩三级| 欧美香蕉大胸在线视频观看| 欧美乱大交xxxxx另类电影| www国产精品视频| 26uuu另类亚洲欧美日本老年| 欧美区在线播放| 日韩在线中文字| 精品一区电影国产| 亚洲性夜色噜噜噜7777| 中文字幕视频在线免费欧美日韩综合在线看| 亚洲淫片在线视频| 欧美电影免费观看网站| 欧美激情啊啊啊| 国产日韩换脸av一区在线观看| 韩国美女主播一区| 国产精品国产亚洲伊人久久| 欧美日韩国产限制| 亚洲欧美日韩在线一区| 欧美激情免费在线| 日韩av网站在线| 美女av一区二区| 97免费在线视频| 欧美日韩国产页| 中文字幕精品www乱入免费视频| 欧美孕妇孕交黑巨大网站| 亚洲精品一区二三区不卡| 热久久美女精品天天吊色| 国自在线精品视频| 欧美日韩国产一区二区三区| 日本亚洲欧美三级| 亚洲精品一区二区网址| 国产精品久久久久久超碰| 91po在线观看91精品国产性色| 亚洲剧情一区二区| 亚洲最大福利视频网站| 黑人巨大精品欧美一区二区| 国内精品一区二区三区四区| 97婷婷涩涩精品一区| 欧美福利视频在线| 精品久久久久久久中文字幕| 国产亚洲欧洲高清一区| 夜夜嗨av一区二区三区免费区| 超碰精品一区二区三区乱码| 97在线视频一区| 91香蕉嫩草神马影院在线观看| 色婷婷av一区二区三区在线观看| 亚洲免费高清视频| 伊人久久久久久久久久久久久| 中文字幕av一区| 国产精品亚洲第一区| 欧美性xxxxxxx| 欧美国产视频一区二区| 欧美午夜美女看片| 久久91精品国产| 国产精品麻豆va在线播放| 成人午夜在线视频一区| 亚洲女人天堂成人av在线| 亚洲一区二区国产| 精品福利在线看| 97免费中文视频在线观看| 亚洲国产成人久久综合| 亚洲视频欧美视频| 97免费视频在线| 欧美日本高清视频| 国产美女直播视频一区| 午夜欧美不卡精品aaaaa| 国产精品久久婷婷六月丁香| 国产成人精品国内自产拍免费看| 在线免费观看羞羞视频一区二区| 久久久女人电视剧免费播放下载| 欧美精品久久久久久久久久| 国产一区二区日韩精品欧美精品| 中文字幕欧美专区| 国产精品高潮呻吟久久av野狼| 欧美精品videossex性护士| 日韩在线观看你懂的| 欧美激情亚洲另类| 久久综合伊人77777蜜臀| 国产美女直播视频一区| 欧美疯狂做受xxxx高潮| 大伊人狠狠躁夜夜躁av一区| 久久人人爽人人爽爽久久| 欧美激情精品久久久久久久变态| 亚洲一区二区三区777| 欧美电影免费观看网站| 国产裸体写真av一区二区| 国产成人+综合亚洲+天堂| 2020国产精品视频| 91精品国产综合久久男男| 中文字幕亚洲一区二区三区| 最新的欧美黄色| 欧美中文字幕视频| 2019中文字幕在线免费观看| 亚洲xxxx视频| 青青a在线精品免费观看| 欧美体内谢she精2性欧美| 成人免费观看49www在线观看| 欧美多人爱爱视频网站| 国产精品激情av在线播放| 久久影视电视剧免费网站清宫辞电视| 91精品国产综合久久久久久蜜臀| 欧美精品videosex性欧美| 国产自产女人91一区在线观看| 国产精品网站视频| 欧美专区日韩视频| 欧美精品在线观看| 91视频国产一区| 成人免费淫片aa视频免费| 伊人久久久久久久久久久久久| 一区二区三区高清国产| 综合国产在线视频| 亚洲欧美三级在线| 日本久久亚洲电影| 日韩精品在线观看网站| 亚洲国产中文字幕久久网| 国产福利精品在线|