跳至主内容

Ruby AMQP 性能测试

·3 分钟阅读
Jakub Stastny

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

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

我不会详细介绍这些性能测试的技术细节,请 获取源代码 自己查看。我运行了所有示例 50,000 次,除了 AMQP preamble 的示例,我运行了 200,000 次。

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

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

这还不是全部,我在内存消耗方面甚至有更好的结果:新的编码器/解码器需要的对象少 5.417 倍!这肯定也会影响性能,因为 Ruby 的垃圾回收 (GC) 相当弱。

平均而言,解码速度仅提高 3.449 倍,内存占用减少 2.083 倍,而编码速度提高 6.300 倍,内存占用减少 8.75 倍

实际上,这些性能测试并不完全公平,因为 AMQ Protocol 的编码器/解码器比 AMQP gem 中的功能做得更多:它更细粒度,并且始终处理错误,而旧版本却经常悄悄失败。这种灵活性和额外的功能显然有一些开销(尽管它仍然显著更快!)。

下一步是什么?嗯,我待办事项列表中的下一件大事是将 AMQ Protocol 集成到 AMQP gem 中,以便您可以在下一个 0.8 版本中受益于这些新变化!然后,如果我还有时间(我的合同快到期了),我很想对对性能影响重要的那些方法进行进一步优化。

© . This site is unofficial and not affiliated with VMware.