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 的性能指标的主要内容,如果未能解决你的问题,请参考以下文章