6.5.1 muduo 与Boost.Asio、libevent2 的吞吐量对比(2)
以上结果让人大跌眼镜,muduo 居然比libevent2 快70%!跟踪libevent2 的源代码发现,它每次最多从socket 读取4096 字节的数据(证据在buffer.c 的evbuffer_read() 函数),怪不得吞吐量比muduo 小很多。因为在这一测试中,muduo 每次读取16 384 字节,系统调用的性价比较高。
为了公平起见,我再测了一次,这回两个库都发送4096 字节的消息(见图6-4)。
|
| 图6-4 |
测试结果表明muduo 的吞吐量平均比libevent2 高18% 以上。
多线程测试的结果(见图6-5),数字越大越好。
|
| (点击查看大图)图6-5 |
测试结果表明muduo 的吞吐量平均比asio 高15% 以上。
讨论
muduo 出乎意料地比asio 性能优越,我想主要得益于其简单的设计和简洁的代码。asio 在多线程测试中表现不佳,我猜测其主要原因是测试代码只使用了一个io_service,如果改用“io_service per CPU”的话,其性能应该有所提高。我对asio 的了解程度仅限于能读懂其代码,希望能有asio 高手编写“io_service perCPU”的ping pong 测试,以便与muduo 做一个公平的比较。
由于libevent2 每次最多从网络读取4096 字节,这大大限制了它的吞吐量。
ping pong 测试很容易实现,欢迎其他网络库(ACE、POCO、libevent 等)也能加入到对比中来,期待这些库的高手出马。