作者:mobiledu2502929447 | 来源:互联网 | 2022-12-05 19:36
我最近开始在工作中阅读和使用gRPC.gRPC在内部使用协议缓冲区作为其IDL,我随时随地读取协议缓冲区执行得更好,尤其是与JSON和XML相比更快.
我不明白的是 - 他们是怎么做到的?与XML和JSON相比,协议缓冲区中的哪些设计实际上使它们的执行速度更快?
1> Marc Gravell..:
数据的字符串表示:
需要文本编码/解码(这可能很便宜,但仍然是一个额外的步骤)
需要复杂的解析代码,特别是如果有人类友好的规则,如"必须允许空格"
通常涉及更多的带宽 - 因此更多的实际有效负载流失 - 由于嵌入诸如名称之类的东西,并且(再次)必须处理人性化的表示(例如,如何标记语法)
通常需要许多用于成员查找等的中间字符串实例
基于文本和基于二进制的序列化器都可以快速有效(或者速度慢且可怕)......只是:二进制序列化器的优势在于其优势.这意味着"好"二进制序列化器通常比"好"基于文本的序列化器更快.
让我们比较一个整数的基本例子:
JSON:
{"id":42}
如果我们假设ASCII或UTF-8编码并且没有空格,则为9个字节.
XML:
42
如果我们假设ASCII或UTF-8编码并且没有空格,则为11个字节 - 并且没有像命名空间那样的命名空间噪声.
protobuf的:
0x08 0x2a
2个字节
现在想象一下编写一个通用的xml或json解析器,以及你需要在文本层处理的所有歧义和场景,然后你需要将文本标记映射"id"
到一个成员,然后你需要做一个整数解析"42"
.在protobuf中,有效负载较小,加上数学很简单,成员查找是一个整数(因此:适合非常快switch
/跳).
顺便说一句:万一有人不确定'0x08 0x2a'是否代表相同的情况:https://protogen.marcgravell.com/decode?hex=082a