93

有没有人有任何关于 Protocol Buffers 与 BSON(二进制 JSON)或一般 JSON 的性能特征的信息?

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

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

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

4

4 回答 4

75

这篇文章比较了 .NET 中的序列化速度和大小,包括 JSON、BSON 和 XML。

替代文字

替代文字

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

于 2010-01-04T20:36:34.817 回答
66

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

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

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

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

于 2010-01-04T17:41:09.287 回答
54

以下是一些最近的基准测试,展示了流行的 .NET 序列化程序的性能。

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

在此处输入图像描述

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

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

于 2010-08-18T03:00:02.877 回答
25

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

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

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

于 2010-01-04T17:40:59.413 回答