json - 协议缓冲区如何比 XML 和 JSON 快?
问题描述
我最近开始在工作中阅读和使用 gRPC。gRPC 在内部使用协议缓冲区作为其 IDL,并且我一直在到处阅读,与 JSON 和 XML 相比,协议缓冲区的性能更好、更快。
我不明白的是——他们是怎么做到的?与 XML 和 JSON 相比,协议缓冲区中的哪些设计实际上使它们的执行速度更快?
解决方案
数据的字符串表示:
- 需要文本编码/解码(这可能很便宜,但仍然是一个额外的步骤)
- 需要复杂的解析代码,特别是如果有诸如“必须允许空格”之类的人性化规则
- 通常涉及更多的带宽 - 因此需要更多实际的有效负载 - 由于嵌入了名称等内容,并且(再次)必须处理对人类友好的表示(例如,如何标记语法)
- 通常需要大量用于成员查找等的中间字符串实例
基于文本和基于二进制的序列化器都可以快速高效(或缓慢而可怕)......只是:二进制序列化器具有倾斜的优势。这意味着“好的”二进制序列化程序通常比“好的”基于文本的序列化程序更快。
让我们比较一个整数的基本示例:
json:
{"id":42}
如果我们假设 ASCII 或 UTF-8 编码并且没有空格,则为 9 个字节。
xml:
<id>42</id>
如果我们假设 ASCII 或 UTF-8 编码并且没有空格,则为 11 个字节 - 并且没有像命名空间这样的命名空间噪音。
protobuf:
0x08 0x2a
2 个字节
现在想象一下编写一个通用的 xml 或 json 解析器,以及您需要在文本层处理的所有歧义和场景,然后您需要将文本标记映射"id"
到一个成员,然后您需要在"42"
. 在 protobuf 中,payload 更小,加上数学很简单,并且 member-lookup 是一个整数(所以:适合非常快的switch
/jump)。
推荐阅读
- r - 来自 tidyverse 的 group_by 示例无法正常工作
- javascript - jQuery 日期选择器未在单击时打开
- python - 谷歌 Colab TPU 版本
- oauth-2.0 - 每次我使用 YouTube 数据 API v3 时,如何绕过输入验证码来授权我的代码
- python - PyCharm 在 Mac 上找不到 Tesseract
- reactjs - 如何在 MuiDataTable 的 customBodyRender 中使用 onClick 事件中的值?
- python - discord py我如何为具有ID的服务器成员用户赋予角色
- javascript - FlatList 更新缓慢
- google-analytics - 为什么在 GA 中记录的交易带有(未设置)登陆页面
- vuejs2 - Nuxt 商店 mapGetters 属性在 beforeCreate() 钩子上未定义