程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> c#編寫高性能Tcp Socket應用注意事項

c#編寫高性能Tcp Socket應用注意事項

編輯:C#入門知識

 

以下是在實現一個高性能Socket組件總結下來的問題,如果你只需要處理幾千的並發應用那代碼編寫上注意一下就行了,但需要面對上萬或幾萬的並發應用.那以下問題的總結,相信對編寫這方面的應用有很大的幫助.

SocketAsyncEventArgs

 

這個對象是.net 2.0 sp1後提供的,主要用於實現高性能Socket數據發送和接收處理(對於更詳細的介紹可以到MSDN上了解).該對象提供了三個方法設置相關發送和接收的緩沖區,SetBuffer(Int32, Int32),SetBuffer(Byte(), Int32, Int32),BufferList,前兩者不能和後者共存(MSDN上有說明原因).當你設置Buffer無論是SetBuffer(Byte(), Int32, Int32)和BufferList,盡可能的在整個程序生命周期裡每個SocketAsyncEventArgs實例只設置一次,因為這個設置會非常損耗資源.建議在SocketAsyncEventArgs在構造的時候通過SetBuffer(Byte(), Int32, Int32)設置數據緩沖區,以後通過SetBuffer(Int32, Int32)來處理.當你要設置BufferList,最好不要改變IList<ArraySegment<byte>>引用的byte[]源.如果改變了,會導致SocketAsyncEventArgs重新綁定緩沖區影響效率.

SocketAsyncEventArgs池

 

上面已經提到盡可能不要改變SocketAsyncEventArgs所引用的緩沖區,為了達到這個目的.所以需要建一個SocketAsyncEventArgs應用池,在程序開始的時候盡可能的初始化用到的SocketAsyncEventArgs對象.除了減少SocketAsyncEventArgs的創建外,構造池還能大大的節省內存;主要原因是你無法知道每個消息有多大,當然可以在設計前給消息給一個最大限制,然後來設置SocketAsyncEventArgs對應的緩沖區.不過這樣就非常浪費內存,因為並不是什麼消息都具備最大長度.給SocketAsyncEventArgs分配適量的緩沖大小,通過池的方式提供調用,靈活地把消息寫入到一個或多個SocketAsyncEventArgs,或者多個消息存放到一個SocketAsyncEventArgs中處理.

隊列

 

看到很多做法都是接收數據後,直接開線程或扔給線程池去做,這種做法非常不好,因為不能更好地控制線程的工作包括線程的等待.通過自定義的線程+隊列,你可以很好象控制多少個線程負責什麼工作,排隊的工作也只會存在隊中;並不會出現大量線程或大量線等待的情況,引發操作系統對線程調度所帶的資源損耗.

延時合並數據

 

延時合並數據發送是一種解決網絡IO操作過多的一個手段,這種方式用的場景不多,但在游戲服務器中是普遍存在的.之前有人向我提供一個問題,假如場景中有400用戶,每個用戶的環境改變都會告訴其他用戶.如果不采用合並數據發送的話,那會產生非常恐布的網絡IO操作,這種IO操作次數系統是很難承載的.所以針對當前應用在適當的延時區間內進行數據合並發送處理是很有必要的.

 

作者 smark

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved