Boost.Asio和ACE之間關於Socket程式設計的比較

大囚長發表於2019-01-28

ACE是一個很成熟的中介軟體產品,為自適應通訊環境,但它過於巨集大,一堆的設計模式,架構是一層又一層,對初學者來說,有點困難。 
ASIO是基本Boost開發的非同步IO庫,封裝了Socket,簡化基於socket程式的開發。

最近分析ASIO的原始碼,讓我無不驚呀於它的設計。在ACE中開發中的記憶體管理一直讓人頭痛,ASIO的出現,讓我看到新的曙光,成為我新的好夥伴。簡單地與ACE做個比較。

boost::asio是一個高效能的網路開發庫,Windows下使用IOCP,Linux下使用epoll。與ACE不同的是,它並沒有提供一個網路框架,而是採取元件的方式來提供應用介面。但是對於常見的情況,採用一個好用的框架還是能夠簡化開發過程,特別是asio的各個非同步介面的用法都相當類似。

Boost.Asio是利用當代C++的先進方法,跨平臺,非同步I/O模型的C++網路庫.

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

相關文章