24

我需要序列化具有 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 库的性能,或者编写我自己的 plus 找出更有效的方法来从 V8 中提取字符串。一种策略可能是向 BSON 添加 UTF16 支持。

所以我来这里是为了想法,也许是理智检查。

编辑

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

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

4

4 回答 4

15

我最近(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 库慢。

有关详细信息,请参阅全文

于 2020-07-29T14:17:57.407 回答
10

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

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

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

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

基准是 Java,我想你可以达到接近 protobuf 的 protostuff 实现的速度,即快 13.5 倍。最坏的情况(如果由于某种原因 Java 更适合序列化),你不能比普通的未优化 protobuf 实现更糟糕,它的运行速度要快 6.8 倍。

于 2011-06-14T20:21:04.757 回答
4

看看MessagePack。它与 JSON 兼容。从文档:

快速紧凑的序列化

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

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

于 2011-06-03T08:24:17.363 回答
0

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

...

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

于 2016-07-26T10:37:48.280 回答