Ruby AMQP 基准测试
我决定运行一些关于我的 AMQP 编码器/解码器(AMQ 协议 gem)的基准测试,与 AMQP gem 中的旧编码器/解码器进行对比,看看它是否性能更好。到目前为止,我只进行了一些最基本的优化,比如将可重用的值存储在常量中,还没有做特别的事情。
我进行了两组基准测试:使用我修改过的 RBench(支持自定义格式化程序,例如将结果写入 YAML 文件)进行 CPU 时间基准测试,以及使用 Object.count_objects
(Ruby 1.9)进行内存基准测试。
我不会详细介绍这些基准测试的技术细节,请获取源代码并自行查看。我运行每个示例 50,000 次,除了 AMQP 前导码的示例,我运行了 200,000 次。
以下是 CPU 时间基准测试的结果(tmm1 表示旧的编码器/解码器,amqp 表示新的,第一个图表是解码,第二个是编码)
如您所见,结果非常令人鼓舞,**新的编码器/解码器始终明显更快,平均速度是旧编码器/解码器的 4.875 倍**。(显然,并非所有指标都具有相同的相关性:无论 Connection.Open
的解码速度有多快,您每个连接只调用它一次,在大多数情况下这意味着每个客户端运行一次。)
不仅如此,我实际上在内存消耗方面获得了更好的结果:**新的编码器/解码器需要的对象少 5.417 倍**!这肯定也会影响性能,因为 Ruby 的垃圾回收机制相当弱。
平均而言,**解码速度仅提高了 3.449 倍,内存使用量减少了 2.083 倍,而编码速度提高了 6.300 倍,内存使用量减少了 8.75 倍**。
实际上,这些基准测试并不完全公平,因为 AMQ 协议编码器/解码器比 AMQP gem 中的编码器/解码器做了更多的事情:它更细粒度,并且始终处理错误,而旧的编码器/解码器则经常默默地失败。这种灵活性额外的功能显然会带来一些开销(但它仍然快得多!)。
接下来是什么?好吧,我的待办事项列表中的下一件大事是将**AMQ 协议集成到 AMQP gem 中,以便您可以在下一个 0.8 版本中受益于这些新更改**!然后,如果我有时间(我的合同即将到期),我很乐意对那些对性能影响很大的方法进行进一步优化。