FlatBuffers 为什么比 Protobuf 快

要理解 FlatBuffers 为什么比 Protobuf 快,我们可以从数据存储方式使用流程两个核心角度来通俗解释:

数据存储方式对比:像 "压缩包" vs "货架商品"

1. Protobuf 的 "压缩包" 式存储

plaintext 复制代码
[字段1标记(类型+长度)] [字段1值] [字段2标记] [字段2值] ... [字段N标记] [字段N值]
  • 特点:字段按顺序紧凑排列,每个字段前都有 "标记"(类似快递包裹上的面单,写着 "里面是什么、有多大")。
  • 读取场景 :比如要读 "字段 3",必须先拆前面的包裹:
    → 先读字段 1 的标记→算字段 1 值的位置→跳过字段 1→读字段 2 的标记→算字段 2 值的位置→跳过字段 2→才能找到字段 3 的值。
    (就像拆快递时,必须按顺序拆完前两个包裹,才能拿到第三个)

2. FlatBuffers 的 "货架商品" 式存储

plaintext 复制代码
[索引表(vtable)] → 记录每个字段的位置:字段1在偏移量100,字段2在偏移量200...  
[字段1值](地址100)  
[字段2值](地址200)  
...  
[字段N值](地址N00)  
  • 特点:字段像货架上的商品,每个都有固定 "货架号"(地址),索引表就是 "商品目录",直接写着每个商品的位置。
  • 读取场景 :读 "字段 3" 时,直接查索引表→找到地址 300→直接去地址 300 拿值,完全不用管前面的字段。
    (就像去超市买可乐,直接看目录找货架号,直奔目标,不用逛完整个超市)

数据处理流程对比:"直接用" vs "复制后用"

1. Protobuf 的处理流程(想象成 "搬家")

plaintext 复制代码
原始二进制数据 → 解析时,把数据"搬"到Protobuf对象里(复制) → 通过对象.getXXX() 拿数据  
  • 就像你网购了一批零食(原始数据),必须先从快递箱(二进制)里拿出来,逐个放到零食盒(对象)里,想吃的时候再从盒子里拿 ------ 多了 "搬家"(复制)这一步。

2. FlatBuffers 的处理流程(想象成 "直接开吃")

plaintext 复制代码
原始二进制数据 → 解析时,生成"索引表"(画地图) → 直接从原始数据里"按地址"拿值  
  • 就像零食直接摆在透明贩卖机上(原始数据),给你一张货架地图(索引表),想吃哪个直接按地图坐标伸手拿,不用拆包装、不用搬家 ------ 少了所有额外步骤。

关键差异总结图

操作 Protobuf FlatBuffers
读字段 按顺序解析所有前置字段 直接查索引表定位地址
数据复制 需要复制到对象(有开销) 直接操作原始数据(无复制)
速度关键 解析顺序依赖 + 复制开销 随机访问 + 零复制

通过这两个场景的对比,应该能更直观地理解:FlatBuffers 的 "随机访问" 和 "零复制" 特性,让它在读取效率上远超需要 "顺序解析" 和 "数据复制" 的 Protobuf~

相关推荐
子兮曰16 小时前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰16 小时前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万16 小时前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝16 小时前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
胡写代码16 小时前
别再前后端各写一套表单校验了
java·后端
三十而立洋17 小时前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
大勇前进17 小时前
原生 PHP 还是 Laravel?小项目到底要不要上框架
后端
yuzhi_liu17 小时前
我用 LangGraph4j 实现 Multi-Agent Supervisor
后端
alsmile17 小时前
Node-RED 之外,国产规则引擎的新方案:基于标准语法,Go 先行实现
后端·开源·go
大白8017 小时前
PHP 内存溢出排查思路:看懂报错日志,精准定位问题
后端