為公平比較事件處理效率(非吞吐量),採用 libevent2 自帶的效能測試程式「擊鼓傳花」對比 muduo 與 libevent2 在高並發下的 I/O 事件處理能力。
測試場景
- 1000 個連接 (socketpair/pipe) 形成環狀
- 資料在連接間順序傳遞:寫 1 位元組 → 讀出 → 寫入下一連接
- 100 次傳遞後停止,記錄總耗時
- 活動連接數:100 或 1000;總並發連接數:100 到 100,000
- 需調高檔案描述符限制 (如 256000)
測試程式
- libevent2:修正 2.0.6-rc 小 bug 的
bench.c
- muduo:
examples/pingpong/bench.cc
- 測試腳本:參考 libev 作者 Marc Lehmann 版本修改
第一輪測試結果

紅線=libevent2,**綠線**=muduo,數值越小越好。橫座標為對數刻度。
關鍵發現
- 初始化階段: libevent2 比 muduo 快 20%(左側圖表)
- 事件處理階段: (右側圖表)
- 100 活動連接:並發 <1000 時持平;>30000 muduo 領先;1000-30000 libevent2 領先
- 1000 活動連接:並發 <10000 持平;>10000 muduo 明顯領先
原因分析:epoll_ctl ADD vs MOD
前 24 輪熱身後:
- muduo 使用
EPOLL_CTL_MOD 更新既有 watcher
- libevent2 繼續用
EPOLL_CTL_ADD 重複添加並忽略 EEXIST 錯誤
EPOLL_CTL_ADD 重複添加快速失敗,MOD 需做更多工作較慢。libevent2 因此在初始化「撿便宜」。
第二輪驗證:muduo 改用 ADD 模式
藍線**=修改後 muduo(圖表中)。初始化效能超越 libevent2,事件處理耗時也降低(推測核心內部機制)。此修改僅為驗證,未併入正式版本。
筆記本環境複現(雙核 2.4GHz)

趨勢一致。
結論
事件處理效率方面,muduo 與 libevent2 總體接近、各擅勝場。並發量極大 (>10k) 時 muduo 略佔優勢。