代码之家  ›  专栏  ›  技术社区  ›  gravetii

协议缓冲区如何比XML和JSON更快?

  •  6
  • gravetii  · 技术社区  · 6 年前

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

    3 回复  |  直到 5 年前
        1
  •  29
  •   Marc Gravell    6 年前

    数据的字符串表示:

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

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

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

    json码:

    {"id":42}
    

    9字节,如果我们假设ASCII或UTF-8编码,没有空格。

    xml格式:

    <id>42</id>
    

    协议:

    0x08 0x2a
    

    2字节

    就在文本层 ,则需要映射文本标记 "id" "42" . 在protobuf中,有效负载更小,加上数学简单,成员查找是一个整数(因此:适用于非常快的 switch /跳跃)。

        2
  •  1
  •   Andriy Plokhotnyuk    6 年前

    虽然二进制协议在理论上有优势,但在实践中,它们的性能可能会比JSON或其他文本表示协议差,具体取决于实现。

    高效的JSON解析器,比如 RapidJSON jsoniter-scala 以每字节2-8个周期的速度解析大多数JSON样本。它们的序列化效率甚至更高,除了一些边缘情况,如带有浮点数的数字,当序列化速度下降到每字节16-32个周期时。

    https://github.com/dkomanov/scala-serialization/pull/8

        3
  •  1
  •   user2879582    6 年前

    我不得不说二进制协议 典型的