有人了解Protocol Buffers相对于BSON(二进制JSON)或一般JSON的性能特点吗?
- 数据传输大小
- 序列化速度
- 反序列化速度
这些似乎是在HTTP上传输的好的二进制协议。我只是想知道,在C#环境中,哪种协议从长远来看会更好。
下面是我在BSON和Protocol Buffers上阅读到的信息。
有人了解Protocol Buffers相对于BSON(二进制JSON)或一般JSON的性能特点吗?
这些似乎是在HTTP上传输的好的二进制协议。我只是想知道,在C#环境中,哪种协议从长远来看会更好。
下面是我在BSON和Protocol Buffers上阅读到的信息。
这篇文章比较了.NET中的序列化速度和大小,包括JSON、BSON和XML。
http://james.newtonking.com/archive/2010/01/01/net-serialization-performance-comparison.aspx
Thrift是另一种类似于 Protocol Buffers 的选择。
Java 社区有很好的基准测试,可以比较这些技术的序列化/反序列化和线路大小:https://github.com/eishay/jvm-serializers/wiki
通常情况下,JSON 在线路大小上略大,DeSer 稍差;但是它在普及性和能够不需要源 IDL 轻松解释的能力方面胜出。最后一点是Apache Avro正在努力解决的问题,且在性能方面超过了两者。
Microsoft 发布了一个 C# NuGet 包Microsoft.Hadoop.Avro。
以下是一些最近的基准测试结果,展示了流行的.NET序列化器的性能。
Burning Monks 基准测试 展示了序列化简单 POCO 的性能,而综合的 Northwind 基准测试 展示了序列化 Microsoft Northwind 数据集中每个表格的行的组合结果。
基本上,协议缓冲区 (protobuf-net) 比.NET中最快的基类库 Serializer (XML DataContractSerializer) 快7倍。它也比竞争对手更小,因为它还比Microsoft最紧凑的序列化格式(JsonDataContractSerializer) 小2.2倍。
ServiceStack的文本序列化器与二进制protobuf-net的性能最接近,其中它的Json序列化器仅比protobuf-net慢2.58倍。
Protocol Buffers旨在用于数据传输:
JSON只是文本格式,需要进行解析。提示:在JSON中编码“十亿”个整数将需要相当多的字符:Billion = 12个字符(长标度),但在二进制格式下可以适配于uint32_t中。现在如果尝试编码一个double呢?那将会更加糟糕。