使用Google V8进行最快速的Javascript对象序列化

问题描述 投票:14回答:3

我需要使用1-100的混合类型属性来序列化中等复杂的对象。

最初使用JSON,然后我切换到BSON,速度稍快。

编码10000个样本对象

JSON:        1807mS
BSON:        1687mS
MessagePack: 2644mS (JS, modified for BinaryF)

我想要一个数量级的增加;它对系统的其他部分产生了非常糟糕的影响。

转向BSON的部分动机是对二进制数据进行编码的要求,因此JSON(现在)不适合。而且因为它只是跳过对象中存在的二进制数据,所以它们在那些基准测试中“作弊”。

描述了BSON性能热点

  • (不可避免?)将UTF16 V8 JS字符串转换为UTF8。
  • BSON库中的malloc和字符串操作

BSON编码器基于Mongo BSON库。

本机V8二进制序列化器可能很棒,但由于JSON是原生的并且可以快速序列化,我担心即使这可能无法提供答案。也许我最好的办法是优化BSON库中的内容,或者编写自己的加号,以便更有效地将字符串拉出V8。一种策略可能是为BSON添加UTF16支持。

所以我在这里提出想法,也许是一个健全检查。

编辑

添加了MessagePack基准测试。这是从原始JS修改为使用BinaryF。

C ++ MessagePack库可以提供进一步的改进,我可以单独对其进行基准测试,以直接与BSON库进行比较。

javascript serialization v8 bson embedded-v8
3个回答
5
投票

对于序列化/反序列化,protobuf非常难以击败。我不知道你是否可以切换传输协议。但是,如果你可以绝对应该考虑protobuf。

看看Protocol Buffers versus JSON or BSON的所有答案。

接受的答案选择thrift。然而它比protobuf慢。我怀疑这是为了易用(使用Java)而不是速度。 These Java benchmarks非常有说服力。 值得注意的

  • MongoDB-BSON 45042
  • protobuf 6539
  • protostuff / protobuf 3318

基准是Java,我想你可以在protobuf的protostuff实现附近达到速度,即快13.5倍。最糟糕的情况(如果出于某种原因,Java对于序列化来说更好),那么运行速度快6.8倍的普通未优化protobuf实现就不会更糟。


3
投票

看看MessagePack。它与JSON兼容。来自文档:

快速紧凑的序列化

MessagePack是一个基于二进制的高效对象序列化库。它可以在许多语言(如JSON)之间交换结构化对象。但与JSON不同,它非常快且小巧。

典型的小整数(如标志或错误代码)仅保存在1个字节中,典型的短字符串只需要1个字节,但字符串本身的长度除外。 [1,2,3](3个元素数组)使用MessagePack以4个字节序列化,如下所示:


1
投票

如果您对反序列化速度更感兴趣,请查看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%。

...

不幸的是,它不是流式格式,这意味着您必须离线预处理数据。但是,有计划将其转换为流式格式(检查里程碑)。

© www.soinside.com 2019 - 2024. All rights reserved.