协议缓冲区与JSON或BSON

时间:2010-01-04 17:33:52

标签: c# json comparison protocol-buffers bson

有没有人有关于协议缓冲区与BSON(二进制JSON)或一般JSON的性能特征的任何信息?

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

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

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

4 个答案:

答案 0 :(得分:74)

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

alt text

alt text

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

答案 1 :(得分:63)

Thrift也是另一种类似协议缓冲区的替代方案。

Java社区有关于序列化/反序列化以及这些技术的线缆大小的良好基准:https://github.com/eishay/jvm-serializers/wiki

一般来说,JSON的线径略大,DeSer稍差,但无处不在并且无需源IDL就能轻松解读。最后一点是Apache Avro试图解决的问题,它在性能方面都胜过两者。

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

答案 2 :(得分:50)

以下是some recent benchmarks,显示了流行的.NET Serializers的性能。

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

enter image description here

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

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

答案 3 :(得分:22)

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

  1. 非常小的消息大小 - 一个方面是非常有效的可变大小的整数表示。
  2. 非常快速的解码 - 它是一种二进制协议。
  3. protobuf生成用于编码和解码消息的超高效C ++ - 提示:如果将所有var-integer或静态大小的项编码到其中,它将以确定的速度进行编码和解码。
  4. 它提供了非常丰富的数据模型 - 有效地编码非常复杂的数据结构。
  5. JSON只是文本,需要解析。提示:将“十亿”int编码到其中会占用相当多的字符:Billion = 12 char(长规模),二进制它适合uint32_t现在尝试编码双精度怎么样?那会更糟糕。