讀通過SendAsync
的Socket
小號BeginAsync
方法的說明,我意識到,有人建議集中SocketAsyncEventArgs
實例說,這是比BeginXX更好,因爲每次調用EndXX異步的方式創建一個IAsyncResult
實例。.NET池的IAsyncResult對象
我認爲這是不是一個很好的做法,可以輕鬆實例化對象(如SocketAsyncEventArgs
)。對象分配速度非常快,並且GC已經過優化,可以有效處理短暫的生命體。我嘗試過實現一個池化機制來查看它是如何執行的,實際上,對於簡單對象來說,分配速度更快,而這些對象只是將某些數據封裝在ctor中。 (好吧,它就像發送數十萬條數據庫來分析DBMS一樣,這就是爲什麼我在這裏。)
我不是問哪個更好,我相信分析實際應用程序會產生答案,但只是好奇關於彙集簡單的短暫生命物體的好處。更好的GC性能?低內存碎片?設計期間是否值得考慮?
從MSDN
這些增強 的主要特點是重複 分配和 對象的同步的高容量異步 套接字I/O過程中避免。當前實現的開始/結束 設計模式 由System.Net.Sockets.Socket類 要求爲每個異步 套接字操作分配一個System.IAsyncResult對象 。
在新System.Net.Sockets.Socket 級增強,異步 插座操作由可重複使用的 描述的SocketAsyncEventArgs由 應用對象 分配和維護。高性能套接字 應用程序知道最好的數量 重疊套接字操作必須 持續。應用程序可以創建與 需要的 SocketAsyncEventArgs對象的許多對象。例如,如果一個服務器 應用程序需要有15個插座 接受所有 次行動的未繳支持傳入的客戶端 連接速率,它可以分配15周 可重用的SocketAsyncEventArgs用於這一目的對象 。
謝謝。
你從哪裏閱讀了這個建議? MSDN?你能鏈接嗎?其次,你在處理什麼樣的套接字代碼?它會成爲許多客戶或一些擁有大量數據的客戶。就個人而言,我會避免增加額外的複雜性,除非明確要求,並且在許多應用程序池中不值得。 – 2010-02-27 14:51:43
@dr。邪惡添加了參考。 大約100個客戶端發送3-5個小包/秒。我還爲每個數據包創建「消息」對象,所以我想知道是否應該將它們集中起來。 – 2010-02-27 14:58:28
我認爲你會比100個客戶端更好,每秒3-5個數據包。我不認爲你需要集中消息(只要確保它正確處理)。在不影響性能的情況下,.NET內存管理可以處理更多的事情。 – 2010-02-27 15:03:05