程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> muduo 與 boost asio 吞吐量對比

muduo 與 boost asio 吞吐量對比

編輯:關於C++

muduo (http://code.google.com/p/muduo) 是一個基於 Reactor 模式的 C++ 網絡庫,我在編寫它 的時候並沒有以高並發高吞吐為主要目標,但出乎我的意料,ping pong 測試表明,muduo 吞吐量比 boost.asio 高 15% 以上。

測試對象

boost 1.40 中的 asio 1.4.3

asio 1.4.5 (http://think-async.com/Asio/Download)

muduo 0.1.1 (http://muduo.googlecode.com/files/muduo-0.1.1-alpha.tar.gz) SHA1 Checksum: a446ea8a22915f439063d2bc52eb2dc4b9caf92d

測試環境

硬件:DELL 490 工作站,雙路 Intel quad core Xeon E5320 CPU,16G 內存

操作系統: Ubuntu Linux Server 10.04.1 LTS x86_64

編譯器:g++ 4.4.3

測試方法

依據 asio 性能測試 http://think-async.com/Asio/LinuxPerformanceImprovements 的辦法,用 ping pong 協議來測試吞吐量。

簡單地說,ping pong 協議是客戶端和服務器都實現 echo 協議。當 TCP 連接建立時,客戶端向服 務器發送一些數據,服務器會 echo 回這些數據,然後客戶端再 echo 回服務器。這些數據就會像乒乓 球一樣在客戶端和服務器之間來回傳送,直到有一方斷開連接為止。這是用來測試吞吐量的常用辦法。

asio 的測試代碼取自 http://asio.cvs.sourceforge.net/viewvc/asio/asio/src/tests/performance/ ,未作更改。

muduo 的測試代碼在 0.1.1 軟件包內,路徑為 examples/pingpong/,代碼如 http://gist.github.com/564985 所示。

muduo 和 asio 的優化編譯參數均為 -O2 -finline-limit=1000

$ BUILD_TYPE=release ./build.sh  # 編譯 muduo 的優化版本

我主要做了兩項測試:

單線程測試,測試並發連接數為 1/10/100/1000/10000 時的吞吐量。

多線程測試,並發連接數為 100 或 1000,服務器和客戶端的線程數同時設為 1/2/3/4。(由於我 家裡只有一台 8 核機器,而且服務器和客戶端運行在同一台機器上,線程數大於 4 沒有意義。)

所有測試中,ping pong 消息的大小均為 16k bytes。測試用的 shell 腳本可從 http://gist.github.com/564985 下載。

測試結果

單線程測試的結果,數字越大越好:

多線程測試的結果,數字越大越好:

測試結果表明 muduo 吞吐量平均比 asio 高 15% 以上。

討論

muduo 出乎意料地比 asio 性能優越,我想主要得益於其簡單的設計和簡潔的代碼。

asio 在多線程測試中表現不佳,我猜測其主要原因是測試代碼只使用了一個 io_service,如果改用 “io_service per CPU”的話,性能應該有所提高。我對 asio 的了解程度僅限於能讀懂其代碼,希望 能有 asio 高手編寫“io_service per CPU”的 ping pong 測試,以便與 muduo 做一個公平的比較。

ping pong 測試很容易實現,歡迎其他網絡庫(ACE、POCO、libevent 等)也能加入到對比中 來,期待這些庫的高手出馬。

查看本欄目

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