跳到主要内容
英文版本为准

本页译自英文,由模型翻译。若与英文原文存在差异,以英文原文为准。

基准测试

ruststream-lapin 在每条消息上的开销:与裸 lapin 客户端对照的吞吐量,以及它自身代码的指令数和内存分配次数。

与裸客户端对照​

第一张图在真实的 RabbitMQ 节点上用三种方式运行同一个场景。裸客户端 是一个手写的循环,直接驱动 lapin。Broker crate 是同一个循环跑在本 crate 上:Broker、队列描述符、订阅的流、投递自带的 ack 和它的发布者,外面没有运行时。RustStream 是用户写的服务:应用里的一个 #[subscriber] 处理器,通过同一个发布者发布。第一段差距是本 crate 比它所封装的客户端多付出的开销,第二段是运行时在其上增加的开销。

每个循环画成一条从最佳一轮到最慢一轮的横条,最佳一轮处有一个圆点,中位一轮处有一道刻痕。坐标轴的零点是裸客户端的最佳一轮,圆点落在零点右侧表示更慢。空心圆点表示该循环与裸客户端的差距小于各轮之间的波动。图下的表格给出最佳一轮,括号里是中位一轮。

两个场景对应 RabbitMQ 自带的两种队列类型。经典队列把消息放在内存里,用一个帧结算一次投递。仲裁队列先通过 Raft 复制每条消息并把它写下来,然后才交出去;这么昂贵的传输,几乎不给它上面的任何东西留下显现的余地。

代码的开销​

第二张图统计一条消息在服务线程上的开销:稳态下由 callgrind 统计的指令数和由 DHAT 统计的内存分配次数。每个场景都是跑在 LapinBroker 上的服务,连接同一个节点。统计范围包括框架的分发、编解码器、本 crate 的代码,以及 lapin 在这个线程上做的工作。lapin 在自己的线程上读写套接字,那个线程不计入。每一行的内存分配大多来自客户端:每一次确认、每一次发布,都会在服务线程上创建 promise 和一个内部任务。冷启动 是建立连接、打开信道、声明队列、注册消费者并取得第一次投递一次性付出的开销。

结果​

与裸客户端对照各循环比裸客户端最佳一轮低多少
  • 裸客户端
  • Broker crate
  • RustStream
  • 各轮,从最佳到最慢
  • 最佳一轮
  • 中位一轮
  • 轮次的波动范围
  • 无法区分

ruststream-lapin 0.7.0 on ruststream 0.7.0, AMD Ryzen 9 7900X 12-Core Processor, Linux 7.2.10-x64v3-xanmod1-1, rabbitmq:4-management-alpine in Docker on localhost, 测量于 2026-10-18. 这些数字是怎样测得的

Classic queue, 512 B JSON, ack each
  • 无法区分
  • 无法区分
Quorum queue, 512 B JSON, ack each
  • 无法区分
  • 无法区分
以表格显示数字
场景裸客户端Broker crateRustStream额外开销
Classic queue, 512 B JSON, ack each63,187 msg/s (62,538)63,001 msg/s (62,226) (比客户端 无法区分)61,650 msg/s (60,015)无法区分
Quorum queue, 512 B JSON, ack each33,202 msg/s (32,709)32,788 msg/s (32,446) (比客户端 无法区分)33,272 msg/s (33,183)无法区分
代码的开销

AMD Ryzen 9 7900X 12-Core Processor, x86_64, 427-5912 MHz, 12 physical, 24 logical, 62.4 GiB, unknown, Linux 7.2.10-x64v3-xanmod1-1, 1.99.0, 3.25.1, bench, inheriting release (opt-level = 3, lto = fat, codegen-units = 16, debug = line-tables-only), ruststream-lapin default (none), ruststream macros,json. ruststream-lapin 0.7.0, ruststream 0.7.0, 测量于 2026-10-18.

指令数
内存分配
classic queue, JSON decode into a small struct, ack each
14,617
16
classic queue, reply published through LapinPublish
22,145.8
27
classic queue, batches of 64 assembled on the client
14,994.4
16.3
以表格显示数字
场景指令数内存分配冷启动
classic queue, JSON decode into a small struct, ack each14,61716370,049 / 217
classic queue, reply published through LapinPublish22,145.827367,859 / 219
classic queue, batches of 64 assembled on the client14,994.416.3377,775 / 223

机器​

处理器AMD Ryzen 9 7900X 12-Core Processor
架构x86_64
频率427-5912 MHz
核心数12 physical, 24 logical
内存62.4 GiB
内存速度unknown
操作系统Linux 7.2.10-x64v3-xanmod1-1
Brokerrabbitmq:4-management-alpine in Docker on localhost
往返时间69.8 us for one basic.qos answered by the server
编译器1.99.0
构建配置bench, inheriting release (opt-level = 3, lto = fat, codegen-units = 16, debug = line-tables-only)
Featureruststream-lapin default (none), ruststream macros,json
RUSTFLAGSnone (the recipe clears RUSTFLAGS, so the numbers are not tied to this CPU)
Valgrind3.25.1

这些数字来自本版本的 docs/benchmarks/results.json,由基准测试的 recipe 写入。方法论说明它们是怎样测得的,数字说明可以从中得出什么结论。