Avro 与 Protobuf 的性能指标

Posted

技术标签:

【中文标题】Avro 与 Protobuf 的性能指标【英文标题】:Performance Metrics for Avro vs Protobuf 【发布时间】:2016-11-05 13:32:06 【问题描述】:

我们正在使用 kafka 来存储消息并推送大量消息(一分钟> 30k)。我不确定它是否相关,但作为 kafka 消息生产者的代码在 jruby 中。

对消息进行序列化和反序列化也会对系统性能产生影响。

有人可以帮助比较 Avro 和 Protocol Buffer 在序列化和反序列化的速度方面吗?

【问题讨论】:

对 *** 来说不是一个好问题,但请查看这篇文章:sammur.com/?p=36 非常感谢尼古拉斯 :) 【参考方案1】:

我不想告诉你这个,但你的问题没有简单的答案。

序列化格式的性能取决于许多因素。首先,性能是实现的属性,而不是格式本身。您真正想知道的是每种格式的特定 JRuby 实现的性能如何(或者可能是 Java 实现,如果您只是包装它们)。答案可能与其他语言(如 C++)的答案大不相同。

此外,性能会因您使用库的方式而异。许多库的 API 在“简单、缓慢”的方式和“快速、困难”的方式之间提供了权衡。优化时,您需要仔细研究文档并查找库作者的示例代码,以了解如何最大限度地发挥性能。

最后 - 也是最重要的 - 性能因您使用的数据而异。不同的格式和实现针对不同类型的数据进行了优化。例如,字符串密集型数据将使用与数字密集型数据截然不同的代码路径。对于每一种格式——甚至是 JSON 和 XML*——总是有可能找到一个用例,它们的性能比其他所有格式都好。警惕来自库作者的基准测试,因为它们往往会强调对他们有利的用例。

不幸的是,如果您真的想知道哪种格式更适合您,唯一的方法是编写两个版本的代码,一个使用每个库,然后比较它们。没有任何外部基准能够为您提供真正的答案。

(我是 Protobuf v2 和 Cap'n Proto 的作者,所以我花了很多时间研究序列化基准并考虑性能。)

* XML 开个玩笑。

【讨论】:

很高兴听到你的消息,我们已经转移到 protobuf 并且它做得很好,顺便说一句,有没有一种好方法可以将 proto 时间戳转换为 ruby​​ 日期时间对象? @AdityaSanghi 抱歉,我对 Ruby protobuf 实现一无所知。想必某处应该有一个库函数,虽然官方的 timestamp.proto 比较新,所以可能还没有添加。

以上是关于Avro 与 Protobuf 的性能指标的主要内容,如果未能解决你的问题,请参考以下文章

mysql的性能瓶颈分析性能指标性能指标信息的搜集工具与方法分析调优工具的使用

MySql主要性能指标说明

性能测试性能分析性能调优,你知多少?

高频性能测试面试题15道

浅谈软件性能测试中关键指标的监控与分析

软考 系统架构设计师系统配置与性能评价① 性能指标