天天看點

ACE與ASIO之間關于Socket程式設計的比較

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的學術研究。

繼續閱讀