ACE與ASIO之間關于Socket編程的比較
ACE與ASIO之間關于Socket編程的比較
轉自:FREE MY SOUL
ACE是一個很成熟的中間件產品,為自適應通訊環境,但它過于宏大,一堆的設計模式,架構是一層又一層,對初學者來說,有點困難。
ASIO是基本Boost開發的異步IO庫,封裝了Socket,簡化基于socket程序的開發。
最近分析ASIO的源代碼,讓我無不驚呀于它設計。在ACE中開發中的內存管理一直讓人頭痛,ASIO的出現,讓我看到新的曙光,成為我新的好伙伴。簡單地與ACE做個比較。
1.層次架構:
ACE底層是C風格的OS適配層,上一層基于C++的wrap類,再上一層是一些框架(Accpetor, Connector,Reactor等),最上一層是框架上服務。
ASIO與之類似,底層是OS的適配層,上一層一些模板類,再上一層模板類的參數化(TCP/UDP),再上一層是服務,它只有一種框架為io_service。
2.涉及范圍:
ACE包含了日志,IPC,線程,共享內存,配置服務等。
ASIO只涉及到Socket,提供簡單的線程操作。
3.設計模式:
ACE主要應用了Reactor,Proactor等。
而ASIO主要應用了Proactor。
4.線程調度:
ACE的Reactor是單線程調度,Proactor支持多線程調度。
ASIO支持單線程與多線程調度。
5.事件分派處理:
ACE主要是注冊handler類,當事件分派時,調用其handler的虛掛勾函數。實現ACE_Handler/ACE_Svc_Handler/ACE_Event_handler等類的虛函數。
ASIO是基于函數對象的hanlder事件分派。任何函數都可能成功hanlder,少了一堆虛表的維護,調度上優于ACE。
6.發布方式:
ACE是開源免費的,不依賴于第3方庫, 一般應用使用它時,以動態鏈接的方式發布動態庫。
ASIO是開源免費的,依賴Boost,應用使用時只要include頭文件,不需動態庫。
7.可移植性:
ACE支持多種平臺,可移植性不存在問題,據說socket編程在linux下有不少bugs。
ASIO支持多種平臺,可移植性不存在問題。
8.開發難度:
基于ACE開發應用,對程序員要求比較高,要用好它,必須非常了解其框架。在其框架下開發,往往new出一個對象,不知在什么地方釋放好。
基于ASIO開發應用,要求程序員熟悉函數對象,函數指針,熟悉boost庫中的boost::bind。內存管理控制方便。
我個人覺得,如果應用socket編程,使用ASIO開發比較好,開發效率比較高。ACE適合于理論研究,它本來就是源于Douglas的學術研究。
posted on 2007-09-21 10:27 金慶 閱讀(606) 評論(16) 編輯 收藏 引用 所屬分類: 1. C/C++
# re: ACE與ASIO之間關于Socket編程的比較 2007-09-21 23:01 missdeer 發現asio占用CPU很厲害,而且不知道是不是我用得不對,傳輸效率并不高。。。 回復 更多評論 # re: ACE與ASIO之間關于Socket編程的比較 2007-09-22 10:15 金慶 @missdeer # re: ACE與ASIO之間關于Socket編程的比較[未登錄] 2007-09-24 16:16 exile asio本身并不占用多少資源, 如果網絡連接數不多,但占用CPU很厲害, 那肯定時是自己寫的程序某個地方出了問題. 回復 更多評論 # re: ACE與ASIO之間關于Socket編程的比較 2007-09-24 23:34 missdeer @exile # re: ACE與ASIO之間關于Socket編程的比較[未登錄] 2007-09-25 10:56 eXile @missdeer # re: ACE與ASIO之間關于Socket編程的比較 2007-09-27 17:05 金慶 @missdeer # re: ACE與ASIO之間關于Socket編程的比較 2007-09-27 21:53 missdeer @金慶 # re: ACE與ASIO之間關于Socket編程的比較 2007-09-28 09:06 金慶 @missdeer # re: ACE與ASIO之間關于Socket編程的比較 2007-09-28 20:36 BlueEngine 問個問題:看上了wxWidgets的i18n,如何利用它來實現現有MFC程序的國際化?各位朋友請給個建議。 回復 更多評論 # re: ACE與ASIO之間關于Socket編程的比較 2007-09-29 09:28 金慶 @BlueEngine # re: ACE與ASIO之間關于Socket編程的比較 2007-12-19 15:37 金慶 @missdeer # re: ACE與ASIO之間關于Socket編程的比較[未登錄] 2007-12-19 21:30 missdeer 平常小數據量傳輸是看不出什么,但如果數據量一大,就很明顯了,你可以試試它的一個http client例子,讓它下載一個1M大小的文件,不管你的網絡環境如何,都會很占CPU。 回復 更多評論 # re: ACE與ASIO之間關于Socket編程的比較 2007-12-20 15:23 沐楓 從版本號也能看出來。asio目前只有0.3.9,還遠未到開發完整。 # re: ACE與ASIO之間關于Socket編程的比較 2007-12-20 17:11 金慶 測了一下,確實是這樣。對于內網傳輸CPU占滿了,對外網(網速很低)沒有明顯的CPU占用。與網絡環境無關嗎?如果是低流量時占CPU,那肯定是有問題。數據流量大時,可以解釋為接收數據太忙,不過也是不正常(相比其它下載工具)。 回復 更多評論 # re: ACE與ASIO之間關于Socket編程的比較 2008-01-29 15:08 lunny asio有兩個版本,一個依賴于boost的,將來會加入boot庫,同時也會發布一個獨立的,并不一定非要用依賴于boost的那個版本。 回復 更多評論評論
ACE,asio都沒用過。只是用了boost中幾個庫之后,對boost有好感。以前的網絡編程都是直接用socket。是否選用asio還需要自己考察。 回復 更多評論
我也希望是自己寫的代碼的問題,畢竟要選擇用一個框架來進行開發,對于一個穩重的項目組來說是很大的一個決心。可是我用的測試代碼就是asio自帶的例子程序,其它相關的文檔提及的也少…… 回復 更多評論
那就應該分析一下測試的環境. 看一下有連接時,無連接時, 局域網中, 公網中.
asio本身帶的例子是很簡單的, 都是用法演示,最多也就服務器設定幾個線程.
在局域網中進行這樣的測試是沒有什么意義的.
boost 的 thread 和asio都是有可能作為系統支持庫進入std::tr2的.
回復 更多評論
我下載了asio 0.3.8準備試試它的例子。不過發現asio不支持VC6。boost其它庫都是支持VC6的,而asio只支持VC7.1和VC8。 回復 更多評論
如果要用Boost之類的模板庫,強烈建議放棄VC6,改用7.1或8.0,無論從編譯器對標準的兼容,還是第三方庫對編譯器的支持上看,7.1都遠遠好于6.0 回復 更多評論
我想的是放棄VC。只要我掌握了wxWidgets,就可以拋棄MFC,然后拋棄VC。 回復 更多評論
以前做過MFC兩套資源來實現中英語言版本。如是只是兩個語言,就沒必要用i18n。當然如果會用wxWidgets的i18n,或者用過,可能選它是正確的選擇。 回復 更多評論
不知占用CPU很厲害的原因找到沒有?我試了asio的幾個例子,都還不錯。只要理解了Proactor模式,使用上應該是相當方便的。 回復 更多評論
因此,成熟自然也遠未到。 回復 更多評論
posted on 2008-04-18 20:47 肥仔 閱讀(1953) 評論(0) 編輯 收藏 引用 所屬分類: 網絡編程