boost::asio很烂吗?

boost::asio很烂吗?

最近这个回答,莫名其妙很多人在关注查看!我厚着脸皮,又重新看了一遍这篇几乎没有实际内容全是观点的水文。回顾答案后,我又翻阅了一次boost::asio的官网【最新版是1.82】,其中针对linux平台的说法,已经有些过时了。官网文档里说明,asio在linux上可以使用io_uring进行真正的异步操作。特此说明一下,希望能给观看的人一些帮助,不至于误导。

官网链接:Platform-Specific Implementation Notes

此时此刻asio伴随着c++新标准的落地,实现了更多强大的功能,希望它越来越好,更希望未来C++的网络库赶快落地,结束C++这个老年编程语言在2023年,标准库居然都没有网络功能的尴尬场景。

---------------------------------2019-04-06 09:10---------------------------------------

Asio写的非常好!

为什么很多人说它性能不好,原因其实很简单。

Asio 给出的标准实例,是单个contex可以多线程run,使用该contex进行分发回调。

这个模型在window 上的iocp 实现,简直完美,因为接口都是系统api,各个线程等待完成事件都是不需要锁来等待的。锁只需要保护队列即可。

Linux 平台,使用epoll模拟,导致一个contex在多个线程run会有一把大锁直接锁调用。其实多线程run就是不同线程切换run,性能的确不行。

但是,linux 平台,你可以改变使用习惯,用一个contex进行accept拿到连接,再建立一个contex池,把连接的处理抛到池中执行。跟默认epoll模型一致,也就可以了。

手机打字不太好说详细,简单说几个特性。

Asio在处理函数调用的时候,用到了本地线程存储,用于频繁回调分配和释放内存的优化,这说明作者对性能是有要求的。

Asio的队列是个非常简单的链表结构,所以塔的锁其实临界区执行内容很小的,也算不错的优化。

最后,服务端一般都是linux平台,再加上asio本身跨平台,代码量大,模板实现,很多大佬其实没有去看过asio的代码,所以他们的很多结论未必可靠。

绝知此事要躬行。代码还是看看好,学习学习也是不错的。

可以对比对比libuv和asio,一个纯c单线程事件库,一个c++多线程事件库。我认为是这么理解的。也没人说libuv性能不好,为啥非要说asio坏话?可能因为它的确代码不友好吧。