【问题标题】:Protocol Buffers versus JSON or BSON [closed]协议缓冲区与 JSON 或 BSON [关闭]
【发布时间】:2019-05-29 18:06:32
【问题描述】:

有没有人了解 Protocol Buffers 与 BSON(二进制 JSON)或一般 JSON 的性能特征?

  • 线径
  • 序列化速度
  • 反序列化速度

这些看起来像是在 HTTP 上使用的很好的二进制协议。我只是想知道从长远来看,对于 C# 环境来说哪个会更好。

这是我在BSONProtocol Buffers 上阅读的一些信息。

【问题讨论】:

  • 有些人认为(我认为这包括前 protobuf 的作者)使用更大但更便宜的序列化格式然后使用快速标准压缩器压缩输出是一个更好的主意。
  • 我认为在问题本身提出某种比较方法之前不应该重新打开它(否则这是为了相当自以为是的讨论/太宽泛)
  • 可能更多的是每种格式的优缺点,答案可能包括决策树。

标签: c# json comparison protocol-buffers bson


【解决方案1】:

This post 比较 .NET 中的序列化速度和大小,包括 JSON、BSON 和 XML。

http://james.newtonking.com/archive/2010/01/01/net-serialization-performance-comparison.aspx

【讨论】:

  • 此答案不包含有关协议缓冲区的信息。
【解决方案2】:

Thrift 也是另一个类似 Protocol Buffers 的替代方案。

Java 社区提供了关于这些技术的序列化/反序列化和线路大小的良好基准:https://github.com/eishay/jvm-serializers/wiki

一般来说,JSON 的线路尺寸稍大,DeSer 稍差,但在普遍性和无需源 IDL 即可轻松解释它的能力方面胜出。最后一点是Apache Avro 试图解决的问题,它在性能方面胜过两者。

微软已经发布了一个 C# NuGet 包Microsoft.Hadoop.Avro

【讨论】:

  • 小消息大小不会自动转换为快速性能,请参阅这篇文章soa.sys-con.com/node/250512
  • 好链接;我唯一不确定的是关于 Avro 的评论——虽然它可以在其核心用例(大量类似的数据条目)中更有效地工作,但它在这个基准测试中的执行速度似乎不是很快(它测试了单个请求)
  • CoDec、MoDem....我更喜欢“SeDes”:)
【解决方案3】:

这里是some recent benchmarks,展示了流行的 .NET 序列化器的性能。

Burning Monks benchmarks 显示序列化简单 POCO 的性能,而综合 Northwind benchmarks 显示序列化 Microsoft 罗斯文数据集的每个表中的行的组合结果。

基本上,协议缓冲区 (protobuf-net) 比 .NET 中最快的基类库序列化器 (XML DataContractSerializer) 快 7 倍。它也比竞争对手小,因为它也比 Microsoft 最紧凑的序列化格式 (JsonDataContractSerializer) 小 2.2 倍

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

【讨论】:

  • 很棒的帖子 - 但如果可能,您应该在显示平均值时始终在条形图上放置误差线。
【解决方案4】:

protocol buffers 是专为线路设计的:

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

JSON 只是文本,需要解析。提示:将“十亿” int 编码到其中需要相当多的字符:Billion = 12 char's (long scale),在二进制中它适合 uint32_t 现在尝试对 double 进行编码怎么样?那会更糟。

【讨论】:

  • 然而,它确实有不处理继承的相当不幸的缺点,虽然组合是一种有效的替代方案,但我不希望被我的数据传输对象强制使用组合而不是继承。跨度>
  • 我相信扩展的使用方式与继承非常相似...developers.google.com/protocol-buffers/docs/reference/…
  • 是的,扩展是一个很好的点。我每天在工作中使用它。
  • "protocol buffers are designed for the wire" 什么是“wire”?
  • @marcospgp the wire 仅表示网络。现在,当我们使用如此多的无线网络时,这听起来可能很奇怪。