首页 > 解决方案 > 协议缓冲区如何比 XML 和 JSON 快?

问题描述

我最近开始在工作中阅读和使用 gRPC。gRPC 在内部使用协议缓冲区作为其 IDL,并且我一直在到处阅读,与 JSON 和 XML 相比,协议缓冲区的性能更好、更快。

我不明白的是——他们是怎么做到的?与 XML 和 JSON 相比,协议缓冲区中的哪些设计实际上使它们的执行速度更快?

标签: jsonprotocol-buffersgrpc

解决方案


数据的字符串表示:

  • 需要文本编码/解码(这可能很便宜,但仍然是一个额外的步骤)
  • 需要复杂的解析代码,特别是如果有诸如“必须允许空格”之类的人性化规则
  • 通常涉及更多的带宽 - 因此需要更多实际的有效负载 - 由于嵌入了名称等内容,并且(再次)必须处理对人类友好的表示(例如,如何标记语法)
  • 通常需要大量用于成员查找等的中间字符串实例

基于文本和基于二进制的序列化器都可以快速高效(或缓慢而可怕)......只是:二进制序列化器具有倾斜的优势。这意味着“好的”二进制序列化程序通常比“好的”基于文本的序列化程序更快。

让我们比较一个整数的基本示例:

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)。


推荐阅读