跳到主要内容

Ruby AMQP 基准测试

·2 分钟阅读
Jakub Stastny

我决定对我的 AMQP 编码器/解码器 (AMQ 协议 gem) 与 AMQP gem 中的旧版本进行一些基准测试,看看它的性能是否更好。到目前为止,我只做了一些最基本的优化,比如将可重用值存储在常量中,没什么特别的(目前)。

我做了两组基准测试:使用 我的 RBench 分支 进行 CPU 时间基准测试,该分支支持自定义格式化程序(例如将结果写入 YAML 文件),以及使用 Object.count_objects (Ruby 1.9) 进行内存基准测试。

我不打算写关于这些基准测试的技术细节,获取源代码并自己看看。我运行每个示例 50,000 次,除了 AMQP 前导码的示例,我运行了 200,000 次。

以下是 CPU 时间基准测试的结果(tmm1 表示旧的编码器/解码器,amqp 表示新的,第一个图表用于解码,第二个用于编码)

如您所见,结果非常令人鼓舞,新的编码器/解码器总是明显更快,平均速度是旧的 4.875 倍。(显然,并非所有指标都具有相同的相关性:无论解码 Connection.Open 的速度有多快,您每个连接只调用一次,这在大多数情况下意味着每个客户端运行一次。)

而且这还不是全部,实际上我在内存消耗方面有更好的结果:新的编码器/解码器需要的对象少了 5.417 倍!这肯定也会影响性能,因为 Ruby GC 相当弱。

平均而言,解码速度仅快 3.449 倍,内存需求少 2.083 倍,而编码速度快 6.300 倍,内存需求少 8.75 倍

实际上,这些基准测试并不是真正公平的,因为 AMQ 协议编码器/解码器比 AMQP gem 中的那个做得更多:它更精细,并且始终处理错误,而旧的那个经常只是默默地失败。这种灵活性和额外的功能显然有一些开销(但它仍然明显更快!)。

接下来是什么?嗯,我 TODO 列表上的下一件大事是将 AMQ 协议集成到 AMQP gem 中,这样您就可以在下一个 0.8 版本中受益于这些新更改!然后,如果我有时间(我的合同快到期了),我很乐意对性能影响重要的方法进行进一步优化。

© . All rights reserved.