在purecpp社區的github組織中有一個協程庫:https://github.com/yyzybb537/libgo
近日有用戶找到我,想要了解一下libgo庫在網絡方面的性能,於是選取已入選標准庫的boost.asio網絡庫的異步模型做橫向對比。
在小包和利用多核方面,libgo庫的網絡性能完爆asio異步模型,8線程處理小包時差距可達十幾倍。
在大包+單線程的情況,libgo庫的網絡比asio異步模型高的不是很多,在一些性能比較差的PC機上,甚至出現性能。
簡要介紹一下測試流程:
1.TCP協議,C/S是同一台物理機的兩個進程,建立1000條連接
2.服務的是echo服務器,收到數據原樣發回,客戶端無限次發送指定大小的數據包,測試取樣包大小為:4字節、32字節、128字節、1024字節、4096字節
3.分不同線程數測試,測試取樣線程數為:單線程,2線程,4線程,8線程
4.用於對比測試的服務端程序分別為:
A)用libgo+syscall編寫
B) 用boost.asio異步模型編寫
5.使用同樣的客戶端程序,以減少干擾
5.測試環境是一台擁有2顆6核12線程CPU的物理機服務器,共24個邏輯線程,Linux系統版本為:CentOS 6.2。
(核心較少的PC機無法發揮libgo的優勢,測試結果差距會縮小)
測試結果圖:
本次測試,並不能說明Asio的性能就一定比libgo庫的網絡性能更差,Asio是對系統調用的一層封裝,很nice的設計,留給用戶很大的優化余地;
花大力氣去調優Asio,也是有希望達到甚至超越libgo庫的網絡性能的。
在實際使用libgo庫時,我更加推薦的是libgo+Asio同步模型的使用方式,性能與開發效率二者可以兼得,而不是從系統調用寫起,已開源libgonet網絡庫!
本次測試所用服務端為git庫中的benchmark/co_server.cpp和benchmark/asio/async_asio_server.cpp 客戶端代碼為: benchmark/co_client.cpp
libgo+Asio同步的使用示例在benchmark/asio_sync目錄下
社區交流群:296561497