协议缓冲区与JSON或BSON的比较[关闭]


90

是否有人对协议缓冲区,BSON(二进制JSON)或JSON的性能有任何了解?

  • 电线尺寸
  • 序列化速度
  • 反序列化速度

这些似乎是通过HTTP使用的良好二进制协议。我只是想知道从长远来看,对于C#环境哪个更好。

这是我正在阅读的有关BSON协议缓冲区的一些信息。


有人认为(我认为这包括一位原protobuf的作者)认为,最好使用较大但便宜的序列化格式,然后使用快速标准压缩器压缩输出。
CodesInChaos


在问题本身提出某种比较方法之前,我不认为这应该重新开始(否则,这是出于相当自以为是的讨论/范围太广)
YakovL,

Answers:


64

节俭也是另一个类似协议缓冲区的替代方案。

Java社区在这些技术的序列化/反序列化和线路大小方面有很好的基准:https : //github.com/eishay/jvm-serializers/wiki

通常,JSON的线径稍大一些,而DeSer稍差一些,但是在无源IDL的情况下具有无处不在的优势和易于解释的能力。最后一点是Apache Avro试图解决的问题,它在性能方面胜过两者。

Microsoft已发布了C#NuGet软件包Microsoft.Hadoop.Avro


1
小消息大小不会自动转换为快速的性能,请参阅本文soa.sys-con.com/node/250512
vtd-xml-author

1
良好的联系;我唯一不确定的是对Avro的评论-虽然它可以针对其核心用例(大量类似的数据条目)更有效地工作,但在该基准测试中它的执行速度似乎并不快(该基准测试了单个请求)
StaxMan 2011年

CoDec,MoDem ....我更喜欢“ SeDes” :)
nawfal 2015年


52

这是一些最近的基准测试,显示了流行的.NET序列化器的性能。

燃烧的和尚基准测试显示序列化一个简单的POCO的性能,同时全面罗斯文基准测试显示,微软的罗斯文数据集的每个表序列化行的综合结果。

在此处输入图片说明

基本上,协议缓冲区(protobuf-net)比.NET(XML DataContractSerializer)中最快的基类库Serializer快7倍左右。它也比竞争产品小,因为它也是2.2倍比微软最紧凑的序列化格式(JsonDataContractSerializer)小。

ServiceStack的文本序列化器最接近二进制protobuf-net的性能,其Json序列化器仅比protobuf-net慢2.58倍


1
很棒的帖子-但是如果可能的话,在显示平均值时,应该始终在条形图上放置误差线。
jtromans

为什么JIL不包含在测试中?(您知道为什么吗?)
Royi Namir 2014年

22

协议缓冲区是为电线设计的:

  1. 消息大小非常小-一方面是非常有效的可变大小整数表示。
  2. 解码速度非常快-这是一种二进制协议。
  3. protobuf生成用于编码和解码消息的超高效C ++-提示:如果将所有var-integers或静态大小的项目编码到其中,它将以确定的速度进行编码和解码。
  4. 它提供了非常丰富的数据模型-有效地编码非常复杂的数据结构。

JSON只是文本,需要对其进行解析。提示:将“十亿”整数编码为整数将需要很多字符:十亿= 12个字符(长标度),二进制形式适合uint32_t现在尝试编码一个double怎么办?这将使FAR更糟。


4
但是,它确实有一个不幸的缺点,就是不处理继承,并且尽管组合是一种有效的选择,但我不希望数据传输对象强迫使用组合而不是继承。
马克·格林

4
我相信可以扩展的方式非常相似,继承......使用developers.google.com/protocol-buffers/docs/reference/...
kralyk

1
是的,扩展是非常好的一点。我每天在工作中在实践中使用它。
Yngve Sneen Lindal 2012年

“为电线设计协议缓冲区”什么是“电线”?
马科斯·佩雷拉

@marcospgp the wire意味着只是网络。现在,当我们使用如此多的无线网络时,听起来可能很奇怪。
Victor Yarema '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.