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

15 javascript serialization v8 bson embedded-v8

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

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

编码10000个样本对象

JSON:        1807mS
BSON:        1687mS
MessagePack: 2644mS (JS, modified for BinaryF)
Run Code Online (Sandbox Code Playgroud)

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

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

描述了BSON性能热点

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

BSON编码器基于Mongo BSON库.

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

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

编辑

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

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

Ade*_*ost 12

我最近发表了一篇(2020 年)文章和基准比较 JavaScript 中的二进制序列化库。

比较了以下格式和库:

  • 协议缓冲区:protobuf-js, pbf, protons,google-protobuf
  • 阿夫罗: avsc
  • 布森: bson
  • BSER: bser
  • JSB二进制: js-binary

根据当前的基准测试结果,我将按以下顺序对顶级库进行排名(值越高越好,测量值比 JSON 快 x 倍):

  1. avsc: 10x 编码,3-10x 解码
  2. js-binary: 2x 编码,2-8x 解码
  3. protobuf-js: 0.5-1x 编码,2-6x 解码,
  4. pbf: 1.2x 编码,1.0x 解码
  5. bser: 0.5x 编码,0.5x 解码
  6. bson: 0.5x 编码,0.7x 解码

我没有包含msgpack在基准测试中,因为根据其 NPM 描述,它目前比内置 JSON 库慢。

有关详细信息,请参阅完整的文章


def*_*ode 7

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

看看Protocol Buffers与JSON或BSON的所有答案.

接受的答案选择节俭.然而它比protobuf慢.我怀疑这是为了易用(使用Java)而不是速度. 这些Java基准测试非常有说服力.
值得注意的

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

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