我需要使用1-100的混合类型属性来序列化中等复杂的对象。
最初使用JSON,然后我切换到BSON,速度稍快。
编码10000个样本对象
JSON: 1807mS
BSON: 1687mS
MessagePack: 2644mS (JS, modified for BinaryF)
我想要一个数量级的增加;它对系统的其他部分产生了非常糟糕的影响。
转向BSON的部分动机是对二进制数据进行编码的要求,因此JSON(现在)不适合。而且因为它只是跳过对象中存在的二进制数据,所以它们在那些基准测试中“作弊”。
描述了BSON性能热点
BSON编码器基于Mongo BSON库。
本机V8二进制序列化器可能很棒,但由于JSON是原生的并且可以快速序列化,我担心即使这可能无法提供答案。也许我最好的办法是优化BSON库中的内容,或者编写自己的加号,以便更有效地将字符串拉出V8。一种策略可能是为BSON添加UTF16支持。
所以我在这里提出想法,也许是一个健全检查。
编辑
添加了MessagePack基准测试。这是从原始JS修改为使用BinaryF。
C ++ MessagePack库可以提供进一步的改进,我可以单独对其进行基准测试,以直接与BSON库进行比较。
对于序列化/反序列化,protobuf非常难以击败。我不知道你是否可以切换传输协议。但是,如果你可以绝对应该考虑protobuf。
看看Protocol Buffers versus JSON or BSON的所有答案。
接受的答案选择thrift。然而它比protobuf慢。我怀疑这是为了易用(使用Java)而不是速度。 These Java benchmarks非常有说服力。 值得注意的
基准是Java,我想你可以在protobuf的protostuff实现附近达到速度,即快13.5倍。最糟糕的情况(如果出于某种原因,Java对于序列化来说更好),那么运行速度快6.8倍的普通未优化protobuf实现就不会更糟。
看看MessagePack。它与JSON兼容。来自文档:
快速紧凑的序列化
MessagePack是一个基于二进制的高效对象序列化库。它可以在许多语言(如JSON)之间交换结构化对象。但与JSON不同,它非常快且小巧。
典型的小整数(如标志或错误代码)仅保存在1个字节中,典型的短字符串只需要1个字节,但字符串本身的长度除外。 [1,2,3](3个元素数组)使用MessagePack以4个字节序列化,如下所示:
如果您对反序列化速度更感兴趣,请查看JBB (Javascript Binary Bundles)库。它比BSON或MsgPack更快。
来自Wiki,页面JBB vs BSON vs MsgPack
:
...
- JBB比Binary-JSON(BSON)快约70%,并且在解码速度上比MsgPack快约30%,即使有一个负面的测试用例(#3)。
- JBB创建的文件(甚至是压缩版本)比Binary-JSON(BSON)小61%,比MsgPack小约55%。
...
不幸的是,它不是流式格式,这意味着您必须离线预处理数据。但是,有计划将其转换为流式格式(检查里程碑)。