You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何BSON解析速度快于JSON?技术原理深度问询

BSON遍历速度优于JSON的核心原因解析

问题背景

我正深入研究BSON技术,已查阅多个相关问题(如《Why is JSON faster than BSON in node.js?》《Which one is lighter, JSON or BSON?》),但仍未理解BSON遍历速度快于JSON的核心原因。

根据BSON官方FAQ所述:

BSON is also designed to be fast to encode and decode. For example, integers are stored as 32 (or 64) bit integers, so they don't need to be parsed to and from text. This uses more space than JSON for small integers, but is much faster to parse.

我此前认为计算机均以二进制存储数据,对此存疑:这种存储方式为何具备特殊性?

此外,FAQ中给出的BSON示例也未让我理解其解析更快的原因,是否存在BSON特有的起止标识助力快速遍历?

附示例代码:

{"hello": "world"}
→   
  \x16\x00\x00\x00                   // total document size
  \x02                               // 0x02 = type String
  hello\x00                          // field name
  \x06\x00\x00\x00world\x00          // field value
  \x00                               // 0x00 = type EOO ('end of object')

 {"BSON": ["awesome", 5.05, 1986]}
→   
  \x31\x00\x00\x00
  \x04BSON\x00
  \x26\x00\x00\x00
  \x02\x30\x00\x08\x00\x00\x00awesome\x00
  \x01\x31\x00\x33\x33\x33\x33\x33\x33\x14\x40
  \x10\x32\x00\xc2\x07\x00\x00
  \x00
  \x00

核心原因解析

1. 二进制类型直接存储,跳过文本解析开销

你觉得计算机都用二进制存储没错,但JSON本质是文本格式,这是关键差异:

  • JSON里的数值(比如1986、5.05)都是以字符序列的二进制形式存储的,解析时必须把'1'、'9'这类字符逐个转换成对应的数值,要做字符校验、进制转换,步骤多开销大。
  • BSON直接把整数存成32/64位二进制数值、浮点数存成标准8字节二进制,解析时直接读取这段二进制就能拿到原始值,完全不需要文本转译,速度自然快很多。

2. 结构化标识+长度字段,实现无扫描快速遍历

BSON的二进制结构自带类型标记和长度信息,这是它能快速遍历的核心设计:

  • 每个字段开头都有1字节的类型标识(比如\x02是字符串、\x01是浮点数、\x10是32位整数),解析器一眼就知道接下来要处理什么类型,不用像JSON那样扫描字符判断是对象、数组还是值。
  • 字符串、数组、对象都有前置长度字段:比如第一个示例里world的长度是\x06\x00\x00\x00(6字节),解析器可以直接跳过对应长度的字节定位到下一个字段;数组/对象的总长度也存在开头,想跳过整个结构时直接根据长度偏移指针就行,不用像JSON那样匹配括号找边界。
  • 还有专门的\x00(EOO,对象结束)标识,明确标记文档或对象的结尾,避免JSON中需要扫描到}才能确定结束的低效操作。

结合示例看遍历效率

拿第二个示例的数组["awesome", 5.05, 1986]来说:

  1. 开头的\x26\x00\x00\x00是数组总长度,解析器立刻知道接下来26字节都是数组内容;
  2. \x02\x30\x00标记这是键为"0"的字符串类型,后面的\x08\x00\x00\x00是字符串长度,直接读取8字节就能拿到awesome;
  3. 接着\x01\x31\x00是键为"1"的浮点数类型,直接读取8字节二进制就得到5.05;
  4. \x10\x32\x00是键为"2"的32位整数,读取4字节二进制就是1986;
  5. 最后\x00标记数组结束,整个过程都是按固定长度和类型直接跳转,没有任何字符扫描和匹配的开销。

内容的提问来源于stack exchange,提问作者Vishal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 16:03:25